Как автоматически обновлять токен Cognito на странице

#angular #amazon-cognito #aws-amplify

#angular #amazon-cognito #aws-amplify

Вопрос:

Я использую сервис AWS Cognito для аутентификации. В моем приложении Angular 7 я использую Amplify Auth для защиты своих страниц.

Если пользователь переходит между разными страницами, Amplify автоматически обработает обновление токена, и они не увидят истечения срока действия токена.

Если пользователь долгое время остается на одной странице, токен не будет обновляться, и в конечном итоге пользователь увидит токен с истекшим сроком действия и получит 403 для вызова веб-службы.

Есть ли хорошее решение для обновления токенов доступа / идентификатора, если пользователь долгое время остается на одной странице?

Ответ №1:

Вероятно, двумя способами :

  1. Используйте Auth.currentSession(), чтобы получить текущий действительный токен или получить новый, если срок действия текущего истек. Amplify справится с этим
  2. В качестве запасного варианта используйте некоторое интервальное задание для обновления токенов по требованию каждые x минут, возможно, 10 минут. Это требуется, когда у вас длительный процесс, такой как загрузка очень большого видео, который займет более часа (возможно, из-за медленной сети), тогда срок действия вашего токена истечет во время загрузки, и amplify не будет обновляться автоматически для вас. В этом случае эта стратегия будет работать. Продолжайте обновлять свои токены с некоторым интервалом. В документах не упоминается, как обновлять по требованию, так что вот оно.
 import { Auth } from 'aws-amplify';

try {
  const cognitoUser = await Auth.currentAuthenticatedUser();
  const currentSession = await Auth.currentSession();
  cognitoUser.refreshSession(currentSession.refreshToken, (err, session) => {
    console.log('session', err, session);
    const { idToken, refreshToken, accessToken } = session;
    // do whatever you want to do now :)
  });
} catch (e) {
  console.log('Unable to refresh Token', e);
}
  

подробнее здесь:https://github.com/aws-amplify/amplify-js/issues/2560

Ответ №2:

Если вы вызываете cognitoUser.getSession из Cognito Javascript SDK, это принудительно обновит локальные токены, если они больше не действительны.

Я думаю, здесь у вас есть несколько вариантов:

1) Вызывайте cognitoUser.getSession перед каждым вызовом API. Это async вызов, поэтому убедитесь, что у вас есть результат, прежде чем продолжить вызов API. Если токены действительны, этот вызов будет очень быстрым и недорогим. Если вам нужны новые токены, обновление токена может занять секунду или две.

2) Выполните вызов API, и если вы получите ответ 403, вызовите getSession , и как только у вас будет результат от этого, попробуйте снова вызвать API. Или, если вызов не так важен, просто обновите токен, установите какой-нибудь счетчик ошибок, и если в следующий раз произойдет сбой, сообщите об этом пользователю в этот момент.

Комментарии:

1. Пока я использую только Auth. Можете ли вы предоставить полный фрагмент для этой операции?

Ответ №3:

В документации по аутентификации Amplify: retrieve current session показано, как это сделать с помощью Auth.currentSession(), это возвращает обещание и обновляет токены по истечении срока действия. В данных, возвращаемых в блоке Auth.currentSession().then(), вы получаете объект CognitoUserSession с ключами iat и exp в idToken.полезная нагрузка, они могут использоваться для определения того, когда срок действия idToken истекает. Вы можете использовать их в своей службе аутентификации для повторного подключения токенов, когда это необходимо.