1

在我的 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());

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

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

在政策范围内我还有什么需要做的吗?我无法在互联网上为我的用例找到一个工作示例。在这里得到一些支持会很棒。

谢谢!

4

2 回答 2

0

从错误看来,您设置了访问策略,但没有设置信任策略。取自这里的亚马逊文档

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

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

文档链接包含在 Cognito 控制台中设置适当角色的步骤。

于 2014-09-23T17:47:52.997 回答
0

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

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

如果您使用 Cognito 控制台,则为您创建的角色应该为该身份池正确设置其信任关系。如果您想了解有关 Cognito 身份验证的更多信息,可以在我们的博客上阅读。

我想注意的一些额外的事情:

  • CognitoCachingCredentialsProvider即使您更改身份池,也会缓存 id,您可以调用 clear 以确保您没有使用来自旧池的缓存 id 。
  • 您不需要从提供者中提取部分凭证,您只需将凭证提供者直接传递给服务客户端的构造函数即可。
于 2014-09-25T04:38:48.417 回答