使用Amazon Cognito创建临时AWSCredentials

时间:2014-09-23 16:38:09

标签: android amazon-web-services credentials amazon-cognito

在我的Android应用程序中我想为AWS创建临时凭证,因此我不必在我的应用程序中存储我的秘密AWS凭据。我使用此代码创建凭据:

CognitoCachingCredentialsProvider cognitoProvider = new CognitoCachingCredentialsProvider(
                getApplicationContext(), // get the context for the current activity
                "XXXXXXXXXX",
                "us-east-1:XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
                "arn:aws:iam::XXXXXXXXXXX:role/myUnauthRole",
                "arn:aws:iam::XXXXXXXXXXX:role:role/myAuthRole",
                Regions.US_EAST_1
        );
AWSCredentials awsCredentials = new BasicAWSCredentials(cognitoProvider.getCredentials().getAWSAccessKeyId(), cognitoProvider.getCredentials().getAWSSecretKey());

当我这样尝试时,我的代码的最后一行出现错误,错误为"Not authorized to perform sts:AssumeRoleWithWeb Identity"。我认为我用于myUnauthRolemyAuthRole的政策存在问题。它看起来像这样:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:GetFederationToken",
    "Resource": "*"
  }]
}

在政策中我还有什么需要做的吗?我在鼻涕上找到了一个可用的例子。很高兴在这里得到一些支持。

谢谢!

2 个答案:

答案 0 :(得分:0)

从错误中看,您似乎已设置了访问策略,但未设置您的信任策略。取自Amazon documentation here

  

为了允许移动应用访问资源,您必须创建应用可以承担的一个或多个IAM角色。与任何角色一样,移动应用程序的角色包含两个策略。一种是信任策略,它指定谁可以担任角色(可信实体或委托人)。另一个策略(访问策略)指定允许或拒绝移动应用程序访问的实际AWS操作和资源,类似于用户或资源策略。

     

信任策略必须为sts:AssumeRoleWithWebIdentity操作授予Allow效果。

文档链接包含在Cognito Console中设置相应角色的步骤。

答案 1 :(得分:0)

正如其他答案中所述,问题在于您的信任关系,而不是您的访问政策。要检查您的信任关系中的一些事项:

  • 您使用的身份池ID是否与信任关系中列出的内容相匹配?
  • 确保以正确的顺序使用unauth角色和auth角色实例化凭据提供程序。

如果您使用Cognito Console,则为您创建的角色应该为该标识池正确设置其信任关系。如果您想了解有关Cognito身份验证的更多信息,可以阅读on our blog

我还想注意一些其他事项:

  • 即使您更改了身份池,CognitoCachingCredentialsProvider也会缓存ID,您可以调用clear来确保您没有使用较旧池中的缓存ID。
  • 您无需从提供程序中提取凭据部分,只需将凭据提供程序直接传递给服务客户端的构造函数即可。