我正在使用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,您可以在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用户池或身份池将用于移动应用程序,而前端开发人员? 正确的做法是什么?代码示例总是很好,但我更喜欢寻找逻辑解决方案或文档链接。 我尝试了亚马逊认知身份(这不是我要找的),并阅读了所有(?)留档这件事,但我不能在这里连接点...
所以我一直在试图弄明白这一点,但文档不够清晰。 我正在尝试使用AWS cognito用户池和联邦身份池。 在网上,他们说你可以连接这两个人,然后通过你的用户池验证用户,从你的身份池获得证书。现在我已经将它们连接起来,它显示为授权方法,但我无法弄清楚在目标c中要做什么才能让它工作。我只能让未经授权的用户进入我的联邦身份池,而不是授权用户。 我还负责用户池的所有工作(创建和验证用户),因此只需将他们放
我正在尝试在iOS(Swift)应用程序中实现新的AWS Cognito用户池,但我很难让登录过程正常工作。我基本上是在尝试遵循这里提供的示例。 这是我到目前为止所拥有的: AppDelegate: LoginView控制器: 当我点击“登录”按钮时,似乎什么也没有发生,尽管如果我再次点击它,我会得到一个NSInternalInconsistencyException(我相信这是因为AWSTask