【问题标题】:Unable to get user attributes in the cognitoUser object after authenticating using aws-amplify使用 aws-amplify 进行身份验证后无法获取 cognitoUser 对象中的用户属性
【发布时间】:2021-04-02 08:48:55
【问题描述】:

我有一个 Angular 11 项目,我在其中使用 AWS Amplify (aws-amplify v3.3.26),并且使用 Cognito 用户池来管理用户。我已经设置了托管 UI,并且没有使用任何自定义属性。一切正常,我已经在用户池的用户属性中选择了读写权限的所有属性。

我正在使用以下代码来获取 cognitoUser 对象:-

Auth.currentAuthenticatedUser()
      .then((currentUser) => {
        console.log('The currentUser => ', currentUser);
      
        Auth.currentUserInfo()
          .then((res) => {
            console.log('Here are the current user info! =>', res);
          })
          .catch((err) => {
            console.log('Current user info failed to fetch', err);
          });
       
      })
      .catch((err) => {
        console.log(err);
      });
    return;
  }

根据AWS Amplify docs,我应该能够在 cognitoUser 对象中获取属性。但我没听懂。

这就是我得到的全部(还要注意会话为空,不确定这意味着什么):-

如您所见,对象中没有“属性”键。

我还注意到有一个可用的 Auth.currentUserInfo() 方法,而我的控制台日志只是导致一个空对象。

正如您在此处看到的,我已经为用户池客户端定义中的所有属性设置了所有必需的权限,并且我没有任何自定义属性:-

目前我将姓名和电子邮件作为必需属性存储,所有用户都有。但我无法访问它。我能够看到深深嵌套在 cognitoUser 对象 (cognitoUser.signInUserSession.idToken.payload.email) 中的电子邮件,但仍然找不到 name 属性。我想获取列出当前用户所有可用属性的整个属性对象。

我错过了什么?

【问题讨论】:

  • 嗯,不知道发生了什么,但我在网络上的 aws 管理控制台中搞砸了一堆东西,我认为我做的其中一件事情已经解决了。现在我正在接收属性。我不完全确定,但这可能与身份池有关?很抱歉,我无法准确指出我在这里做了什么,但我现在看到了用户对象中的属性键。 ://

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


【解决方案1】:

我使用下面的这段代码来获取具有相同版本的 Amplify 的用户属性。

const user = await Auth.currentUserInfo();
const userId = user.attributes.sub;

如果用户尚未通过验证,例如通过点击验证电子邮件链接或输入验证码,您将从 Auth.currentUserInfo 返回空对象。

但是在用户通过验证后,您可以使用完全相同的方法获取所有属性。或者通过使用如下代码中的承诺链,或者如果你使用 async/await,只需使用上面的代码。

function getUserInfo(){
    return Auth.currentUserInfo()
          .then((res) => {
            console.log('Here are the current user info! =>', res);
          })
          .catch((err) => {
            console.log('Current user info failed to fetch', err);
          });
}

【讨论】:

  • 是的,这是预期的行为,但由于某种原因,我没有收到用户对象中的属性键。我已经尝试了两种方法。你可以看到我的用户对象的console.log。它只是没有“属性”。我不知道我是否应该在设置客户端或用户池或在 aws 控制台上做其他事情。
  • 你能发布一个用户对象的样例吗?它包含哪些键?和一般结构?特别是如果你有一个叫做“会话”的东西,它包含什么?它是否有 null,就像它对我或其他东西一样?
【解决方案2】:

我也遇到了这个问题,CognitoUser 缺少 attributes 对象。 解决方案是将 aws.cognito.signin.user.admin 范围包括在客户端配置和用户池设置的应用客户端设置页面上。

客户端的oauth 配置应该类似于:

oauth: {
          domain: "https://your-cognito-domain",
          scope: ["phone", "email", "profile", "openid", "aws.cognito.signin.user.admin"],
          redirectSignIn: "https://yourdomain",
          redirectSignOut: "https://yourdomain",
          responseType: "code",
        },

AWS 用户池屏幕中的应用程序客户端设置也应该启用。

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 2020-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多