2016-10-13 40 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 

Iは、添付画像に見られるように、フェデレーテッド・アイデンティティ・プールに対応するために作成された同一のプールに上記使用。 Federated Identities User Pool

コードに戻ると、次の関数を使用してユーザーIDを取得してキャッシュし、同じIDがログインするとGetID()関数の呼び出しが繰り返されないようにします。

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とフィールド識別情報が含まcognitoから資格情報を要求するとき、このトークンは、その後、取り出されます。

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]" 

ユーザロールの信頼権限は次のとおりです。

{ 
    "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" 
      ] 
     } 
     } 
    } 
    ] 
} 

たち-東-1:XXXXXXXXXXXXXXXXは、社会的なだけでなく、cognitoユーザプールの両方を管理し、ユーザーIDプールIDです。

私は上記の問題を理解するために信頼のアクセス許可とコグニートのユーザープールを一覧表示していますが、誰かが上記の問題で私を助けることができたら本当に感謝します。

答えて

1

GetIdへの呼び出しで、ログインプール内のユーザープールユーザーのIDトークンを渡すことはありません。あなたは、マップのように、ユーザーのプールのユーザーのトークンキーとしてcognito-idp.us-east-1.amazonaws.com/us-east-1_your_user_pool_idIDを含むとあなたのGetIdRequestにsetLoginsを呼び出す必要があります値

このログインマップに合格していないため、取得するIDは認証されていないIDであり、認証されたユーザーのみが役割ポリシーに許可されています。

も参照してください。GetId API

+0

実際には、あなたの提案をありがとう。これはうまくいった! – smartinsert

関連する問題