当前位置: 首页 > 知识库问答 >
问题:

从cognito标识池identityId获取cognito用户池用户名

严正诚
2023-03-14

我正在使用AWS Congito用户池进行帐户管理,其中Cognoto标识池将此用户池作为标识提供者。我用它来控制通过API网关对API的访问,API网关向Lambda发送请求。我的Lambda是使用Micronaut用Java8实现的。所有这些都很好。

在Lambda中,我从HttpRequest中的主体获得名称:

  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标识符的字符串名称中返回的是什么。像这样的东西:

us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx

我想记录实际的用户登录,或者至少有一些方法在需要时将identityId转换为登录。

LookupDeveloperIdementAPI调用似乎是解决这个问题的正确方法,但是我无法让它工作。

尝试使用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.NotAuthorized异常:您无法访问此身份(服务:CognitoIdreal,状态代码:400,请求ID:64e36646-612b-4985-91d1-82aca770XXXX)

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

aws cognito身份查找开发者身份--身份id us-east-1:xxxxe650-53f4-4cba-b553-5DFF42BExxx--身份池id us-east-1:XXXXXX0AA1-89f9-4418-be04-7E83C838xxx--最大结果=10

调用LookupdeveloperEntity操作时发生错误(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获取用户池用户名的最佳方法吗?
    • 如果是-我做错了什么?
    • 如果不是——什么是更好的方法?

共有1个答案

郤玉书
2023-03-14

替代方法

为了检索用户的用户池用户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_uuaaaaaaaaaa是用户池id,qqqqq-1111-2222-3333-rrrrrrrrrrrrr是用户池用户id。然后可以拆分字符串并提取用户id。

请注意,这些信息将因您使用的身份验证提供程序而异。

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

参考文献

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

 类似资料:
  • 我有一个Lambda函数来处理由API网关触发的POST请求。后者设置为通过Cognito用户池授权器进行授权。授权有效-如果我传递了一个用户的ID令牌,请求就会被处理,如果我不传递,我就会得到一个401。 但是,我无法在Lambda函数中获取授权用户的身份。所有的文档都让我相信它应该在上下文中,但它不是。我也无法将它映射到上下文中。此外,似乎也没有一种方法可以查询给定ID令牌的用户的用户池。 我

  • 我们的设置是: 创建电子邮件/密码帐户或登录Facebook 我能够创建两个成功独立于彼此与AWS Cognito。 我想解决的问题是,如果用户先有一个电子邮件/密码帐户,然后单击Facebook登录,我希望他们链接并提示用户确认他们有权访问该电子邮件/密码帐户。 一旦用户确认以后,他们应该能够登录Facebook或通过电子邮件/密码登录来访问和调整相同的帐户。 Facebook用户在Cognit

  • 我试图使用Cognito用户池控制台创建一个用户(我正在设置用户名和临时密码的值),但我一直收到这个错误。 属性不符合架构:生日:数字不能超过10个字符(服务:AWSCognitoIdentityProviderService;状态代码:400;错误代码:InvalidParameterException;请求ID:98f3de9e-5ce3-11e7-98e8-9d0c69d31df9) 使用无

  • 一旦用户登录到Cognito,我希望使用lambda函数获取与该用户关联的当前角色。 似乎Cognito用户池或身份池将用于移动应用程序,而前端开发人员? 正确的做法是什么?代码示例总是很好,但我更喜欢寻找逻辑解决方案或文档链接。 我尝试了亚马逊认知身份(这不是我要找的),并阅读了所有(?)留档这件事,但我不能在这里连接点...

  • 我正在尝试在iOS(Swift)应用程序中实现新的AWS Cognito用户池,但我很难让登录过程正常工作。我基本上是在尝试遵循这里提供的示例。 这是我到目前为止所拥有的: AppDelegate: LoginView控制器: 当我点击“登录”按钮时,似乎什么也没有发生,尽管如果我再次点击它,我会得到一个NSInternalInconsistencyException(我相信这是因为AWSTask

  • 所以我一直在试图弄明白这一点,但文档不够清晰。 我正在尝试使用AWS cognito用户池和联邦身份池。 在网上,他们说你可以连接这两个人,然后通过你的用户池验证用户,从你的身份池获得证书。现在我已经将它们连接起来,它显示为授权方法,但我无法弄清楚在目标c中要做什么才能让它工作。我只能让未经授权的用户进入我的联邦身份池,而不是授权用户。 我还负责用户池的所有工作(创建和验证用户),因此只需将他们放