Установка localStorage из всплывающего окна - PullRequest
0 голосов
/ 28 августа 2018

У меня есть всплывающее окно, которое обрабатывает аутентификацию пользователя. Я хочу установить значение organization_id пользователя в localStorage, чтобы у меня был к нему доступ. Вот следующие шаги, которые я предпринимаю с результатом ошибки.

  1. Нажмите логин. Это вызывает всплывающее окно
  2. Введите адрес электронной почты и пароль. При успешной аутентификации всплывающее окно закрывается.
  3. Проверьте локальное хранилище. Не существует атрибута для organization_id

Вот следующие шаги, которые я предпринимаю для успешного результата.

  1. Временно измените код, чтобы предотвратить закрытие всплывающего окна.
  2. Нажмите логин. Это вызывает всплывающее окно.
  3. Введите адрес электронной почты и пароль. Всплывающее окно остается.
  4. Проверьте localStorage и обнаружите, что на самом деле правильно установлен значение organization_id.
  5. Восстановите код, чтобы всплывающее окно снова закрылось.
  6. Нажмите логин. Запускает всплывающее окно.
  7. Введите адрес электронной почты и пароль. Всплывающее окно закрывается.
  8. Проверьте localStorage. Теперь есть идентификатор организации.

Я делаю полную перезагрузку и очищаю кеш после всех изменений.

Что может объяснить это странное поведение? Почему проверка во всплывающем окне заставила его работать?

handleAuthentication () {
this.auth0.parseHash({hash: window.location.hash}, (err, authResult) => {
  if (authResult && authResult.accessToken && authResult.idToken) {
    this.setSession(authResult);
    window.opener.location.reload(true);
    window.close();
    e.preventDefault();
  } else if (err) {
    router.replace('home')
    console.log(err)
    alert(`Error: ${err.error}. Check the console for further details.`)
  }
})
}

setSession (authResult) {
this.auth0.client.userInfo(authResult.accessToken, function(err, user) {
  localStorage.setItem('organization_id', user.organization_id);
});
// Set the time that the access token will expire at
let expiresAt = JSON.stringify(
  authResult.expiresIn * 1000 + new Date().getTime()
)
localStorage.setItem('access_token', authResult.accessToken)
localStorage.setItem('id_token', authResult.idToken)
localStorage.setItem('expires_at', expiresAt)
this.authNotifier.emit('authChange', { authenticated: true })
}

1 Ответ

0 голосов
/ 29 августа 2018

Проблема в том, что окно закрывалось до завершения функции. Решением было установить тайм-аут при закрытии всплывающего окна, как показано ниже:

// Do some function call

setTimeout(()=>{
   window.close()
}, 1500);
...