Как восстановить токен с истекшим сроком действия?

Я использую AWS для своего веб-сайта. Через 1 час токен истекает, и пользователь почти ничего не может сделать.

пока я пытаюсь обновить учетные данные следующим образом:

 function getTokens(session) {
   return {
     accessToken: session.getAccessToken().getJwtToken(),
     idToken: session.getIdToken().getJwtToken(),
     refreshToken: session.getRefreshToken().getToken()
   };
 };


function getCognitoIdentityCredentials(tokens) {
  const loginInfo = {};
  loginInfo[`cognito-idp.eu-central-1.amazonaws.com/eu-central-1_XXX`] = tokens.idToken;
  const params = {
    IdentityPoolId: AWSConfiguration.IdPoolId
    Logins: loginInfo
  };
  return new AWS.CognitoIdentityCredentials(params);
 };


 if(AWS.config.credentials.needsRefresh()) {
    clearInterval(messwerte_updaten);
    cognitoUser.refreshSession(cognitoUser.signInUserSession.refreshToken, (err, session) => {
      if (err) {
        console.log(err);
      }
      else {
        var tokens = getTokens(session);

        AWS.config.credentials = getCognitoIdentityCredentials(tokens);

        AWS.config.credentials.get(function (err) {
          if (err) {
            console.log(err);
          }
          else {
            callLambda();
          }
       });
     }
   });
 }

дело в том, что после 1 часа маркер входа обновляется без проблем, но после 2hrs я больше не могу обновлять маркер входа.

Я также попытался с помощью AWS.config.credentials.get(), AWS.config.credentials.getCredentials() и AWS.config.credentials.refresh() что тоже не работает.

сообщения об ошибках, которые я получаю являются:

отсутствуют учетные данные в config

недопустимый маркер входа. Токен истек: 1446742058 > = 1446727732

3 ответов


обычно это решается путем перехвата http-запросов с дополнительной логикой.

function authenticationExpiryInterceptor() {
 // check if token expired, if yes refresh
}

function authenticationHeadersInterceptor() {
 // include headers, or no
}}

затем с использованием HTTPService layer

  return HttpService.get(url, params, opts) {
     return authenticationExpiryInterceptor(...)
            .then((...) => authenticationHeadersInterceptor(...))
            .then((...) => makeRequest(...))
  }

Она может быть решена по доверенности, а также http://2ality.com/2015/10/intercepting-method-calls.html

в отношении AWS: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html

вы заинтересованы в:

  • getPromise()
  • refreshPromise()

вот как я реализовал это:

сначала вам нужно авторизовать пользователя на сервис и предоставить разрешения:

пример запроса:

вот как я реализовал это:

сначала вам нужно авторизовать пользователя на сервис и предоставить разрешения:

пример запроса:

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id={your client_id}
code=AUTHORIZATION_CODE&
redirect_uri={your rediect uri}

это вернет Json что-то вроде:

HTTP / 1.1 200 ЛАДНО Тип контента: application / json

{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je","id_token":"dmcxd329ujdmkemkd349r", "token_type":"Bearer", "expires_in":3600}

теперь вам нужно получить маркер доступа в зависимости от вашей области:

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=client_credentials&
scope={resourceServerIdentifier1}/{scope1} {resourceServerIdentifier2}/{scope2}

Json будет:

HTTP / 1.1 200 OK Тип контента: application / json

{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}

теперь этот маркер доступа действителен только для 3600 секунд, после чего вам нужно обменять, чтобы получить новый маркер доступа. Для этого

чтобы получить новый токен доступа из обновления Токен:

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token >
Content-Type='application/x-www-form-urlencoded'
Authorization=Basic aSdxd892iujendek328uedj
grant_type=refresh_token&
client_id={client_id}
refresh_token=REFRESH_TOKEN

ответ:

HTTP / 1.1 200 OK Тип контента: application / json

{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}

вы получите картину правильно.

Если вам нужно больше деталей иди сюда.


после почти 2 недель, я наконец решил он.

вам нужен токен обновления, чтобы получить новый токен Id. После получения обновленного токена обновите AWS.конфиг.объект учетных данных с новым токеном Id.

вот пример того, как настроить это, работает гладко!

refresh_token = session.getRefreshToken();   // you'll get session from calling cognitoUser.getSession()

if (AWS.config.credentials.needsRefresh()) {

  cognitoUser.refreshSession(refresh_token, (err, session) => {
    if(err) {
      console.log(err);
    } 
    else {
      AWS.config.credentials.params.Logins['cognito-idp.<YOUR-REGION>.amazonaws.com/<YOUR_USER_POOL_ID>']  = session.getIdToken().getJwtToken();
      AWS.config.credentials.refresh((err)=> {
        if(err)  {
          console.log(err);
        }
        else{
          console.log("TOKEN SUCCESSFULLY UPDATED");
        }
      });
    }
  });
}