#angular #amazon-cognito #aws-amplify
#angular #amazon-cognito #aws-amplify
Вопрос:
Я использую сервис AWS Cognito для аутентификации. В моем приложении Angular 7 я использую Amplify Auth для защиты своих страниц.
Если пользователь переходит между разными страницами, Amplify автоматически обработает обновление токена, и они не увидят истечения срока действия токена.
Если пользователь долгое время остается на одной странице, токен не будет обновляться, и в конечном итоге пользователь увидит токен с истекшим сроком действия и получит 403 для вызова веб-службы.
Есть ли хорошее решение для обновления токенов доступа / идентификатора, если пользователь долгое время остается на одной странице?
Ответ №1:
Вероятно, двумя способами :
- Используйте Auth.currentSession(), чтобы получить текущий действительный токен или получить новый, если срок действия текущего истек. Amplify справится с этим
- В качестве запасного варианта используйте некоторое интервальное задание для обновления токенов по требованию каждые 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 истекает. Вы можете использовать их в своей службе аутентификации для повторного подключения токенов, когда это необходимо.