이 사용자 풀이 자격 증명 공급자 인 Cognito 자격 증명 풀을 사용하여 계정 관리에 AWS Congito 사용자 풀을 사용하고 있습니다. 이것을 사용하여 요청을 Lambda에 보내는 API 게이트웨이를 통해 API에 대한 액세스를 제어하고 있습니다. My 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 :이 ID에 액세스 할 수 없습니다 (서비스 : CognitoIdentity, 상태 코드 : 400, 요청 ID : 64e36646-612b-4985-91d1-82aca770XXXX)
CLI를 통해이를 시도하면 비슷한 결과가 나타납니다.
AWS 인식-식별자-개발자-식별-식별 ID us-east-1 : xxxxe650-53f4-4cba-b553-5dff42bexxxx-식품 풀 ID us-east-1 : xxxx0aa1-89f9-4418-be04- 7e83c838xxxx-최대 결과 = 10
LookupDeveloperIdentity 작업을 호출 할 때 오류 (NotAuthorizedException)가 발생했습니다.이 ID에 액세스 할 수 없습니다
적절한 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에서 사용자 풀 사용자 이름을 얻는 가장 좋은 방법입니까?
- 그렇다면-내가 뭘 잘못하고 있습니까?
- 그렇지 않은 경우-더 좋은 방법은 무엇입니까?
답변
대체 접근법
사용자의 사용자 풀 사용자 ID를 검색하기 위해 람다에서 검색 할 수 있습니다.
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-rrrrrrrrrrrr는 사용자 풀 사용자 ID입니다. 그런 다음 문자열을 분할하고 사용자 ID를 추출 할 수 있습니다.
이 정보는 사용중인 인증 공급자에 따라 다릅니다.
그런 다음 사용자 ID 대신 사용자 이름이 필요한 경우 해당 특정 사용자 ID에 대한 적절한 세부 정보를 가져와 사용자 풀에서 직접 사용자 이름을 추출 할 수 있습니다.
참고
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html