如何使用 Cognito 身份 ID 获取用户属性(用户名、电子邮件等)

How to get user attributes (username, email, etc.) using cognito identity id

我将 AWS Cognito 身份池配置为使用 Cognito 用户池作为身份验证提供程序。

假设我在 Cognito 身份池中有一个身份的身份 ID(例如 us-east-1:XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX),其中这个身份有一个链接到 Cognito 用户池中用户的登录。

如何使用身份 ID 获取链接的用户详细信息(电子邮件、phone、用户名)?

您与 Cognito 联合身份服务交换以获取身份 ID 和凭据的 ID 令牌已具有所有用户属性。您不需要额外调用任何服务。

它是一个 JWT 令牌,您可以使用客户端上的任何库来解码这些值。您可以阅读 this guide 了解有关 Cognito 用户池出售的令牌的更多信息。

或者,您也可以使用访问令牌调用 GetUser API,这将 return 所有用户信息。

console.log('username is ' + cognitoUser.getUsername());

使用这段代码

       GetDetailsHandler detailsHandler = new GetDetailsHandler() {
     @Override
     public void onSuccess(CognitoUserDetails cognitoUserDetails) {
        CognitoUserAttributes cognitoUserAttributes=cognitoUserDetails.getAttributes();
        stringStringHashMap=new HashMap<>();
        stringStringHashMap =cognitoUserAttributes.getAttributes();
         userNumber=stringStringHashMap.get("phone_number");
        e1.setText(userNumber);

        Log.d("Response"," Inside DEATILS HANDLER");
        // Store details in the AppHandler
        AppHelper.setUserDetails(cognitoUserDetails);
        // Trusted devices?
        handleTrustedDevice();
       // e1.setText(input.getText().toString());
         }

         @Override
          public void onFailure(Exception exception) {
        closeWaitDialog();
        showDialogMessage("Could not fetch user details!", AppHelper.formatException(exception), true);
        }
       };
     private void getDetails() {
    AppHelper.getPool().getUser(username).getDetailsInBackground(detailsHandler);
      }  

我遇到了类似的问题,经过太多的抓挠,我无法找到提取细节的确切方法。我的用例是在 android APP 中获取详细信息。 在查看了他们的 AWSMobile 客户端 API 代码之后。我在下面找到了,它正在为我工​​作。

Log.i(TAG, "User Details"+ AWSMobileClient.getInstance().getUserAttributes().toString());

建议 - 尝试使用 AWSMobileclient,以防您将其用于 Android 开发,因为这是推荐用于开发的新库。

AWS cognito-idp list-users 有一个过滤选项,允许您根据属性进行过滤。 'sub' 是与您描述的身份标识匹配的属性。

例如在命令行:

aws cognito-idp list-users --user-pool-id us-east-1_abcdFghjI --filter "sub=\":XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX\""

这还需要用户池 ID,我怀疑您有。此外,我不知道这是如何实现的,也不知道它在过滤大量用户时的表现如何,但我认为自定义属性在过滤器中不可用,这暗示幕后有某种形式的索引。

使用 REST API

AccessToken

认为这可能对某些人非常有帮助,因为我花了很多时间试图弄清楚如何仅使用 accessTokenregion 来获得 UserAttributes(类似this 但使用 REST API(不使用 aws-sdk)

您可以使用此 HTTP 请求获得 UserAttributesaccessToken。 ( GetUser )

Method: POST
Endpoint: https://cognito-idp.{REGION}.amazonaws.com/
Content-Type: application/x-amz-json-1.1
Content-Length: 1162 // Access Token bytes length
X-Amz-Target: AWSCognitoIdentityProviderService.GetUser
Body: {"AccessToken":"ACCESS_TOKEN"}

如果 accessToken 有效,您应该会收到如下示例响应

{
    "UserAttributes": [
        {
            "Name": "sub",
            "Value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
        },
        {
            "Name": "email_verified",
            "Value": "true"
        },
        {
            "Name": "name",
            "Value": "Jason"
        },
        {
            "Name": "phone_number_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number",
            "Value": "+xxxxxxxxxxx"
        },
        {
            "Name": "email",
            "Value": "xxxx@gmail.com"
        }
    ],
    "Username": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}

只是为此苦苦挣扎了一段时间,我使用 Java API 获取用户名的方式是:

identityManager.login(this, new DefaultSignInResultHandler() {
        @Override
        public void onSuccess(Activity activity, IdentityProvider identityProvider) {
            ...               
            String userName = ((CognitoUserPoolsSignInProvider) identityProvider).getCognitoUserPool().getCurrentUser().getUserId();

有一个我们可以初始化的侦听器,它将侦听我们身份验证状态的变化,并允许我们访问发生的身份验证事件的类型,并根据该数据更新应用程序状态。

有了 Amplify,Hub 模块让我们可以很容易地做到这一点:

import { Hub } from 'aws-amplify';

Hub.listen('auth', (data) => {
    const {payload} = data;
    if (payload.event === 'signOut') {
       console.log('signOut');
    } else if (payload.event === 'signIn') {
       console.log('A new auth event has happened: ', data.payload.data.username + ' has ' + data.payload.event);
    }
});

对于那些正在寻找如何以编程方式在 Java 中获取电子邮件参数值的人

我假设您已经知道如何从池中获取所需/所有用户。

假设我有 ListUsersResult 与我的所有用户并说我想检查第一个用户的电子邮件值:

ListUsersResult allUsers = getAllUsers();
UserType userType = allUsers.getUsers().get(0);

首先我可以得到用户的所有属性:

List<AttributeType> attributes = userType.getAttributes();

然后循环查找我们感兴趣的属性(我们的案例 email):

for (AttributeType att : attributes) {
      if (att.getName().equals("email")) {
        // do whatever you want


      }
    }

请记住,打印到控制台很可能无法工作,因为它是敏感数据。但是你可以这样比较:

att.getValue().equals("mymail@mail")