如何恢复过期的令牌[AWS Cognito]?

时间:2018-02-20 14:33:00

标签: javascript amazon-web-services amazon-cognito

我在我的网站上使用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小时后,登录令牌会毫无问题地刷新,但在2小时后我就不能再刷新登录令牌了。

我还尝试使用AWS.config.credentials.get()AWS.config.credentials.getCredentials()AWS.config.credentials.refresh() 哪个也不起作用。

我得到的错误信息是:

  

配置中缺少凭据

     

无效的登录令牌。令牌已过期:1446742058> = 1446727732

4 个答案:

答案 0 :(得分:5)

通常通过使用附加逻辑拦截http请求来解决。

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

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

然后使用HttpService层

  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()

答案 1 :(得分:3)

差不多两个星期后,我终于解决了它。

您需要刷新令牌才能接收新的Id令牌。获取刷新令牌后,使用新的Id令牌更新AWS.config.credentials对象。

这里有一个关于如何设置它,运行顺利的例子!

java.util.Date tempDate = issueDate.toGregorianCalendar().getTime();

答案 2 :(得分:2)

以下是我实施此方法的方法:

首先,您需要授权用户使用该服务并授予权限:

示例请求

以下是我实施此方法的方法:

首先,您需要授权用户使用该服务并授予权限:

示例请求

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好的 Content-Type: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}
杰森将是:

HTTP / 1.1 200好的 Content-Type:application / json

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

现在,此access_token仅在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好的 Content-Type:application / json

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

你说得对。

如果您需要更多详情go here

答案 3 :(得分:0)

这是使用AWS Amplify库刷新访问令牌的方式:

import Amplify, { Auth } from "aws-amplify";

Amplify.configure({
  Auth: {
    userPoolId: <USER_POOL_ID>,
    userPoolWebClientId: <USER_POOL_WEB_CLIENT_ID>
  }
});

try {
    const currentUser = await Auth.currentAuthenticatedUser();
    const currentSession = currentUser.signInUserSession;
    currentUser.refreshSession(currentSession.refreshToken, (err, session) => {
      // do something with the new session
    });
  } catch (e) {
    // whatever
  }
};

此处有更多讨论:https://github.com/aws-amplify/amplify-js/issues/2560