【问题标题】:Refresh Cognito access token after adding user to a Cognito将用户添加到 Cognito 后刷新 Cognito 访问令牌
【发布时间】:2018-06-29 14:31:00
【问题描述】:

你好,我有以下情况。

第一次用户登录后,用户必须选择他们的类型,我通过调用将用户添加到适当的 Cognito 组的 lambda 来完成这项工作。

调用成功后,我想刷新我的 React 应用程序中的用户会话,我通过调用以下代码来完成:

refreshSession = () => {
  return new Promise((resolve, reject) => {     
    this.props.authenticatedUser.refreshSession(this.props.authenticatedUser.signInUserSession.refreshToken, () => {
      Auth.currentAuthenticatedUser()
        .then(updatedAuthUser => {
          this.props.onUserAuthenticated(updatedAuthUser); // update redux state
          resolve();
        })
        .catch(err => {
            console.log(err);
            reject();
        });
    });
  });
};

它在更新 idToken 的值时完成工作 - idToken 有效负载具有更新的用户组和角色。

我遇到的问题是在调用上面定义的 refreshSession 函数后进行的 API 调用。 lambda 调用的行为就好像用户不属于它被添加到的 Cognito 组,我收到 403 响应。如果我注销并再次登录,我可以成功调用 API。

如此有效地我正在做类似(伪代码)的事情:

addUserToCognitoGroup()
  .then(() => {
    // user is added to Cognito Group
    refreshIdToken().then(() => {
      // my idToken seems to be refreshed
      doSomethingThatRequiresMembershipInTheGroup() // this API call returns 403 
  })

我认为这可能与我的代码没有刷新访问令牌有关,但我正在努力寻找正确刷新整个用户会话的方法。

我的 package.json 依赖项

"dependencies": {
  "amazon-cognito-identity-js": "^2.0.11",
  "aws-amplify": "^0.4.6",
  "aws-api-gateway-client": "^0.2.13",
  "aws-sdk": "^2.263.1",
  "aws-serverless-express": "^3.2.0",
  "aws4": "^1.6.0",
  "axios": "^0.18.0",
  "express": "^4.15.2",
  "graphql": "^0.13.2",
  "lodash": "^4.17.10",
  "moment": "^2.22.2",
  "react": "^16.4.1",
  "react-bootstrap": "^0.32.1",
  "react-dom": "^16.4.1",
  "react-intl": "^2.4.0",
  "react-redux": "^5.0.7",
  "react-router": "^4.3.1",
  "react-router-bootstrap": "^0.24.4",
  "react-router-dom": "^4.3.1",
  "react-scripts": "^1.1.4",
  "react-table": "^6.8.6",
  "redux": "^4.0.0"
}

任何指针将不胜感激:)

【问题讨论】:

    标签: reactjs amazon-web-services amazon-cognito aws-amplify


    【解决方案1】:

    今天再次尝试后,我注意到如果在将用户添加到 Cognito 组后重新加载页面,我可以避免收到 403。

    这让我去调试 Amplify 的 Auth API,我注意到它在某些时候调用了一个名为 _setCredentialsFromSession 的函数。所以我去修改我的代码(currentUserCredentials 调用 _setCredentialsFromSession):

    refreshSession() {
      return new Promise((resolve, reject) => {
      this.props.authenticatedUser.refreshSession(this.props.authenticatedUser.signInUserSession.refreshToken, () => {
        Auth.currentUserCredentials().then(() => {
          Auth.currentAuthenticatedUser().then(updatedAuthUser => {    
            this.props.onUserAuthenticated(updatedAuthUser);
            resolve();
          })
          .catch(err => {
              console.log(err);
              reject();
          });
        });
      });
    });
    

    感觉有点脏,但现在可以了。如果有人找到更好的解决方案,请告诉我。

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2020-09-28
      • 2016-12-30
      • 2017-11-22
      • 2018-08-14
      • 2020-11-01
      • 2018-05-06
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多