2016-10-13 2 views
1

AWS Cogito 서비스를 사용하여 AWS Java SDK를 사용하여 Cognito에서 사용자 자격 증명을 가져옵니다.Java : sts : AssumeRoleWithWebIdentity Cognito 사용자 풀

다음으로 https://mobile.awsblog.com/post/TxBVEDL5Z8JKAC/Use-Amazon-Cognito-in-your-website-for-simple-AWS-authentication을 입력하면 Cognito 사용자 풀을 사용하여 사용자를 인증하는 코드를 작성할 수 있습니다.

코드를 작성하기 전에 나는 cognito 사용자 풀을 구성하고 다음 풀 구성 필드를 사용하여 데모 이름을 지정했습니다.

Pool Id us-east-1_GUbY6qQ1v 
Pool ARN arn:aws:cognito-idp:us-east-1:049428796662:userpool/us-east-1_GUbY6qQ1v 

첨부 된 그림에서 볼 수있는 것처럼 페더레이션 ID 풀을 제공하기 위해 만든 ID 풀을 사용했습니다. Federated Identities User Pool

이제 코드로 돌아와서 동일한 ID가 로그인하면 GetID() 함수에 대한 호출이 반복되지 않도록 사용자 ID를 검색하고 캐시하기 위해 다음 함수를 작성했습니다. cognito에서 자격 증명을 요청할 때

public UserIdentity getUserIdentity(User user) throws AuthorizationException { 
if (user == null || user.getUsername() == null || user.getUsername().trim().equals("")) { 
    throw new AuthorizationException("Invalid user"); 
} 
AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(new AnonymousAWSCredentials()); 

GetIdRequest idRequest = new GetIdRequest(); 
idRequest.setAccountId(CognitoConfiguration.AWS_ACCOUNT_ID); 
idRequest.setIdentityPoolId(CognitoConfiguration.IDENTITY_POOL_ID); 

GetIdResult idResp = identityClient.getId(idRequest); 

if (idResp == null) { 
    throw new AuthorizationException("Empty GetOpenIdToken response"); 
} 

GetOpenIdTokenRequest tokenRequest = new GetOpenIdTokenRequest(); 
tokenRequest.setIdentityId(idResp.getIdentityId()); 

GetOpenIdTokenResult tokenResp = identityClient.getOpenIdToken(tokenRequest); 
UserIdentity identity = new UserIdentity(); 
identity.setIdentityId(idResp.getIdentityId()); 
identity.setOpenIdToken(tokenResp.getToken()); 
return identity; 

}

사용자 클래스는,이 토큰은 다음, 검색되는 getOpenIdToken와 필드 ID를 포함합니다.

public AWSSessionCredentials getUserCredentials(User user) throws AuthorizationException { 
if (user == null || user.getCognitoIdentityId() == null || user.getCognitoIdentityId().trim().equals("")) { 
    throw new AuthorizationException("Invalid user"); 
} 

AWSSecurityTokenService stsClient = new AWSSecurityTokenServiceClient(new AnonymousAWSCredentials()); 
AssumeRoleWithWebIdentityRequest stsReq = new AssumeRoleWithWebIdentityRequest(); 
stsReq.setRoleArn(user.getUserRole()); 
System.out.println("The received get open id token is: " + user.getIdentity().getOpenIdToken()); 
stsReq.setWebIdentityToken(user.getIdentity().getOpenIdToken()); 
stsReq.setRoleSessionName("FassetTestSession"); 

AssumeRoleWithWebIdentityResult stsResp = stsClient.assumeRoleWithWebIdentity(stsReq); 
Credentials stsCredentials = stsResp.getCredentials(); 

// Create the session credentials object 
AWSSessionCredentials sessionCredentials = new BasicSessionCredentials(
    stsCredentials.getAccessKeyId(), 
    stsCredentials.getSecretAccessKey(), 
    stsCredentials.getSessionToken() 
); 
// save the timeout for these credentials 
Date sessionCredentialsExpiration = stsCredentials.getExpiration(); 
return sessionCredentials; 

}

사용자 클래스의 관련 부분은 아래와 같다.

public class User { 
    private UserIdentity identity; 
    public String getCognitoIdentityId() { 
    if (this.identity == null) { 
     return null; 
    } 
    return this.identity.getIdentityId(); 
    } 

    public void setCognitoIdentityId(String cognitoIdentityId) { 
    if (this.identity == null) { 
     this.identity = new UserIdentity(); 
    } 
    this.identity.setIdentityId(cognitoIdentityId); 
    } 

}

라인 AssumeRoleWithWebIdentityResult stsResp = stsClient.assumeRoleWithWebIdentity (stsReq)는 아래 정확한 광고와 403 금지 에러를 반환한다.

2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << "<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " <Error>[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " <Type>Sender</Type>[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " <Code>AccessDenied</Code>[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " <Message>Not authorized to perform sts:AssumeRoleWithWebIdentity</Message>[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " </Error>[\n]" 
2016-10-13 17:47:02,330 DEBUG [wire(wire:72)] http-outgoing-4 << " <RequestId>fe4edd9f-913e-11e6-85cd-45155b40299e</RequestId>[\n]" 

사용자 역할에 대한 신뢰 권한은 다음과 같습니다

우리 - 동 - 1
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "Federated": "cognito-identity.amazonaws.com" 
     }, 
     "Action": "sts:AssumeRoleWithWebIdentity", 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "us-east-1:xxxxxxxxxxxxxxxx" 
     }, 
     "ForAnyValue:StringLike": { 
      "cognito-identity.amazonaws.com:amr": [ 
      "accounts.google.com", 
      "graph.facebook.com", 
      "authenticated" 
      ] 
     } 
     } 
    } 
    ] 
} 

: XXXXXXXXXXXXXXXX는 사용자 ID 풀 ID가 모두 사회뿐만 아니라 cognito 사용자 풀을 관리합니다.

위와 같은 문제를 이해하기 위해 트러스트 사용 권한과인지 사용자 풀을 나열하는 수많은 블로그를 통해 갔지만 위의 문제에서 나를 도울 수 있다면 정말 감사하겠습니다.

답변

1

GetId으로 전화를 걸 때 로그인 맵에서 사용자 풀 사용자의 ID 토큰을 전달하지 않습니다. 당신은지도로 사용자 풀 사용자의 토큰 키와 cognito-idp.us-east-1.amazonaws.com/us-east-1_your_user_pool_idID을 포함하여 GetIdRequest에 setLogins를 호출 할 필요가 값

이 로그인 맵을 전달하지 않았으므로 얻은 신원은 인증되지 않은 ID이며 역할 정책에서 인증 된 사용자 만 허용합니다.

도 참조하십시오. GetId API

+0

참으로. 귀하의 제안에 감사드립니다. 이것은 효과가있다! – smartinsert

관련 문제