如何使用cognito身份标识获取用户属性(用户名,电子邮件等)

时间:2016-06-22 09:28:24

标签: amazon-web-services amazon-cognito

我将AWS Cognito Identity Pool配置为使用Cognito User Pool作为身份验证提供程序。

假设我在Cognito Identity Pool中拥有身份的身份ID(例如us-east-1:XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX),其中此身份具有Cognito用户池中用户的链接登录。

使用身份证,我如何获取链接的用户详细信息(电子邮件,电话,用户名)?

8 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:2)

使用REST API

AccessToken

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

您可以使用此HTTP请求将UserAttributesaccessToken一起使用。 (this

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"
}

答案 2 :(得分:0)

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

Log.i(TAG,“用户详细信息” + AWSMobileClient.getInstance()。getUserAttributes()。toString());

建议-如果您将它用于Android开发,请尝试使用AWSMobileclient,因为这是推荐用于开发的新库。

答案 3 :(得分:0)

AWS cognito-idp list-users有一个过滤器选项,使您可以基于属性进行过滤。 “ sub”是与您描述的身份ID匹配的属性。

例如在命令行上:

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

这也需要用户池ID,我怀疑您有。另外,我不知道在过滤大量用户时如何实现或如何执行此操作,但是我认为自定义属性无法在过滤器中使用,以暗示幕后存在某种形式的索引。

答案 4 :(得分:0)

苦苦挣扎了一段时间,使用Java API获得用户名的方式是:

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

答案 5 :(得分:0)

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

使用 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);
    }
});

enter image description here

答案 6 :(得分:-3)

使用这段代码

       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);
      }  

答案 7 :(得分:-10)

$.getJSON('https://jsonplaceholder.typicode.com/photos',
  function(data) {
    $.each(data, function(i, f) {
      $("ul").append('<li id=\"#imageGallery\"><a id=\"imager\" href="' + f.url + '"><img src="' + f.thumbnailUrl + '" alt="' + f.title + '"></a></li>');
    });
    $overlay = $('#overlay');
    $image = $("#fullSize");
    $('#imageGallery img').on('click', function(e) {
      // the image clicked 
      e.preventDefault();
      $imageLocation = $(this).parent().attr("href");
      // get the parent of this which is the a href
      $image.attr("src", $imageLocation).replace("http://", "https://");
      //post URL into new image
      $overlay.show();
    })
  });