как обрабатывать сервис обновления токенов в AWS ampify-js - PullRequest
0 голосов
/ 19 ноября 2018

В своем проекте реагирования я использую пул пользователей AWS Cognito для управления пользователями, для аутентификации пользователей я использую AWS Cognito idToken.через 90 минут сеанс истекает, затем мне нужно обновить с новым idToken.как работать с сервисом обновления токенов в AWS Cognito с помощью ampify-js.Я пробовал с Auth.currentSession() Я буду звонить каждый час, но у меня это не работает.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

После долгой борьбы я нашел решение обновить токен обновления AWS Cognito. Для этого я использую amazon-cognito-identity-js

const AmazonCognitoIdentity = require('amazon-cognito-identity-js');
const CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;

componentWillReceiveProps(nextProps) {
let getIdToken = localStorage.getItem('idToken');
    if(getIdToken !== null){
      let newDateTime = new Date().getTime()/1000;
      const newTime = Math.trunc(newDateTime);
      const splitToken = getIdToken.split(".");
      const decodeToken = atob(splitToken[1]);
      const tokenObj = JSON.parse(decodeToken);
      const newTimeMin = ((newTime) + (5 * 60)); //adding 5min faster from current time
      //console.log(newTimeMin, tokenObj.exp)
      if(newTimeMin > tokenObj.exp){
          this.tokenRefresh();
          console.log('token updated');
      }
    }
}

Обновление метода токена

tokenRefresh(){
    const poolData = {
      UserPoolId : // Your user pool id here,
      ClientId : // Your client id here
    };
    const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    const cognitoUser = userPool.getCurrentUser();
    cognitoUser.getSession((err, session) =>{
      const refresh_token = session.getRefreshToken();
      cognitoUser.refreshSession(refresh_token, (refErr, refSession) => {
          if (refErr) {
              throw refErr;
          }
          else{
              //this provide new accessToken, IdToken, refreshToken
              // you can add you code here once you get new accessToken, IdToken, refreshToken
          }
      }); 
    })
}
0 голосов
/ 14 марта 2019

Я использовал amazon-cognito-identity-js и обновлял ток каждый раз, когда он истекал, и это решало мою проблему. Вот фрагмент кода для хитрой части getJwtToken:

    getJwtToken() {
    if (!this.activeUser) {
      return null;
    }

    const signInUserSession = this.activeUser.getSignInUserSession();
    const idToken = signInUserSession ? signInUserSession.getIdToken() : null;

    if (!idToken || idToken.getExpiration() * 1000 <= Date.now()) {
      if (!signInUserSession.isValid()) {
        const refreshToken = signInUserSession.getRefreshToken();
        return new Promise((resolve) => {
          this.activeUser.refreshSession(refreshToken, (err, session) => {
            if (err) {
              resolve(this.logout());
            }
            this.activeUser.setSignInUserSession(session);
            resolve(session.getIdToken().getJwtToken());
          })
        });
      }
      return Promise.resolve(idToken.getJwtToken());
    }

    return Promise.resolve(idToken.getJwtToken());
  }
0 голосов
/ 20 ноября 2018

Amplify автоматически сохраняет сеанс свежим, пока он активен (т. Е. Пользователь выполняет вызовы API и т. Д.).

Если вы хотите заставить сеанс оставаться активным, даже если они не активно используют ваш API, тогда проще всего было бы вызвать Auth.currentAuthenticatedUser() через равные промежутки времени.

...