我正在将AWS Congito用户池用于具有该用户池作为身份提供者的Cognito身份池的账户管理。我正在使用它来控制通过将请求发送到Lambda的API网关对API的访问。我的Lambda是使用Micronaut在Java 8中实现的。所有这些都工作正常。
在Lambda中,我从Principal
中的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 identityId的字符串名称返回了什么。像这样:
us-east-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"
]
}
所以问题归结为:
答案 0 :(得分:9)
替代方法
要检索用户的用户池用户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,而qqqqqqqqq-1111-2222-3333-rrrrrrrrrrrrrr是用户池用户ID。然后,您可以分割字符串并提取用户ID。
请注意,这些信息将根据您使用的身份验证提供程序而有所不同。
然后,如果您需要用户名而不是用户ID,则可以通过获取特定用户ID的适当详细信息,直接从用户池中提取该用户名。
参考
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html