【问题标题】:Use Amazon Cognito to create temporary AWSCredentials使用 Amazon Cognito 创建临时 AWSCredentials
【发布时间】:2014-11-17 23:12:28
【问题描述】:

在我的 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": "*"
  }]
}

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

谢谢!

【问题讨论】:

  • 您应该仔细检查您的角色是否配置正确。这个blog post 应该可以帮助您了解 Amazon Cognito 身份验证。

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


【解决方案1】:

从错误看来,您设置了访问策略,但没有设置信任策略。取自Amazon documentation here

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

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

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

【讨论】:

  • 不幸的是,这些例子对我没有帮助。我不想和亚马逊、Facebook 或谷歌打交道。我的信任政策是这样的,我真的不知道它有什么问题:
  • { “版本”:“2012-10-17”,“声明”:[ { “Sid”:“”,“效果”:“允许”,“主体”:{ “联合” :“cognito-identity.amazonaws.com”},“操作”:“sts:AssumeRoleWithWebIdentity”,“条件”:{“StringEquals”:{“cognito-identity.amazonaws.com:aud”:“us-east-1 :xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } } } ] }
【解决方案2】:

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

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

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

我还要注意一些额外的事情:

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

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多