使用 aws-amplify 进行身份验证后无法获取 cognitoUser 对象中的用户属性

Raw*_*ode 6 amazon-web-services amazon-cognito angular aws-amplify

我有一个 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;
  }
Run Code Online (Sandbox Code Playgroud)

根据AWS Amplify 文档,我应该能够在 cognitoUser 对象中获取正确的属性。但我不明白。

这就是我得到的全部(另请注意,会话为空,不确定这意味着什么):- 在此输入图像描述

正如您所看到的,对象中没有“attributes”键。

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

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

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

我缺少什么?

小智 5

我也遇到了这个问题,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",
        },
Run Code Online (Sandbox Code Playgroud)

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

应用程序客户端设置


Ste*_*ros 2

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

const user = await Auth.currentUserInfo();
const userId = user.attributes.sub;
Run Code Online (Sandbox Code Playgroud)

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

但用户通过验证后,您可以使用完全相同的方法获取所有属性。可以使用下面代码中的 Promise 链,或者如果使用 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);
          });
}
Run Code Online (Sandbox Code Playgroud)