从Cognito身份池IdentityId获取Cognito用户池用户名


10

我正在将AWS Congito用户池用于具有该用户池作为身份提供者的Cognito身份池的账户管理。我正在使用它来控制通过将请求发送到Lambda的API网关对API的访问。我的Lambda是使用Micronaut在Java 8中实现的。所有这些都工作正常。

在lambda,我是从得到的名称PrincipalHttpRequest

  protected String resolveUser( HttpRequest request ){
    String ret = null;

    Optional<Principal> principal = request.getUserPrincipal();
    if( principal.isPresent() ){
      ret = principal.get().getName();
    }

    if( ret == null || ret.length() == 0 ){
      ret = "unknown";
    }
    return ret;
  }

Cognito identityId的字符串名称中返回的内容。像这样:

我们东部-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx

我想记录实际的用户登录名,或者至少需要某种方式在需要时将identityId转换为登录名。

LookupDeveloperIdentity API调用似乎是去了解这个正确的方式,但我无法得到它的工作。

尝试使用Java和AWS Java SDK 2进行此操作:

  protected String loadUsername( String user ){
    String ret = "unknown:"+user;
    CognitoIdentityClient cognito = CognitoIdentityClient.create();

    LookupDeveloperIdentityRequest request = LookupDeveloperIdentityRequest.builder()
      .identityPoolId( identityPoolId )
      .identityId( user )
      .build();
    LookupDeveloperIdentityResponse response = cognito.lookupDeveloperIdentity( request );
    List<String> identifiers = response.developerUserIdentifierList();
    if( identifiers != null && identifiers.size() > 0 ){
      ret = identifiers.get( 0 );
    }

    return ret;    
  }

引发异常

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException:您无权访问此身份(服务:CognitoIdentity,状态代码:400,请求ID:64e36646-612b-4985-91d1-82aca770XXXX)

通过CLI尝试执行此操作会产生类似的结果:

AWS认知身份查找开发人员身份--identity-id us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1:xxxx0aa1-89f9-4418-be04- 7e83c838xxxx --max-results = 10

调用LookupDeveloperIdentity操作时发生错误(NotAuthorizedException):您无权访问此身份

我已确保适当的IAM策略能够处理此问题,并且当我尝试使用没有该策略的角色时,会遇到另一个错误

    {
        "Effect": "Allow",
        "Action": [
            "cognito-identity:LookupDeveloperIdentity"
        ],
        "Resource": [
            "arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
        ]
    }

因此,问题归结为:

  • 这是从身份池ID中获取用户池用户名的最佳方法吗?
    • 如果是-我做错了什么?
    • 如果不是,什么是更好的方法?

您可以尝试docs.aws.amazon.com/cognitoidentity/latest/APIReference/…为大批量操作推荐的方法。 Are you sure you are using the credentials from the account which owns the identity pool you are requesting lookupDeveloperIdentity for?- forums.aws.amazon.com/thread.jspa?threadID=231354对我来说,它看起来像一个用户的权限,而不是IAM的角色问题。
Jan Garaj

我也尝试过,并且得到了相同的错误消息。我确定我正在使用拥有身份池的帐户的凭据-池上的其他操作可以正常工作。这是一个用户权限,似乎很奇怪……但是,如果是这样,我很想知道如何获得服务器的用户权限。
囚犯

Answers:


6

替代方法

为了检索用户的用户池用户ID,您可以在lambda中进行检索:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

这将返回一个字符串,其中将包含用户的用户池用户ID,其外观类似于:

cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr

其中us-east-1_aaaaaaaaa是用户池ID,qqqqqqqq-1111-2222-3333-rrrrrrrrrrrrrr是用户池用户ID。然后,您可以分割字符串并提取用户ID。

请注意,这些信息将根据您使用的身份验证提供程序而有所不同。

然后,如果您需要用户名而不是用户ID,则可以通过获取该特定用户ID的适当详细信息,直接从用户池中提取该用户名。

参考

https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html


被接受(迟迟没有,但很高兴您获得了奖金代表),即使该页面上的文档说:“虽然未记录以下过程,但希望有一种实际的记录方法可以做到这一点。
囚徒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.