【问题标题】:How to get AWSCredentials given a AWS Cognito access_token如何在给定 AWS Cognito access_token 的情况下获取 AWSCredentials
【发布时间】:2018-09-18 05:25:06
【问题描述】:

在一个 android 应用程序中,一旦用户完成对 Cognito 用户池的身份验证,我就会收到来自 http://<domain>.auth.<region>.amazoncognito.com/login 的 JWT access_token。该用户池链接到 Cognito 身份池。

我应该使用该 access_token 调用什么 API 来获取 AWSCredentials 对象。

我找到的最接近的是AssumeRoleWithWebIdentity,但那是一个 STS API,我在网上阅读的一些内容似乎建议开发人员不要直接使用 STS,而是依赖 Cognito。

此外,我不希望我需要的 API 需要指定角色名称。 Cognito 身份池已配置为为经过身份验证的用户提供特定角色。 AssumeRoleWithWebIdentity 将角色名称作为 API 的输入。因此,这看起来不对。

我查看了Cognito Identity Pool API Reference,但找不到接受 access_token 并返回 AWS 凭证的 API。

更新: 以下使用GetCredentialsForIdentity 的答案抛出ResourceNotFoundException 说它找不到指定的IdentityId。

string access_token = ...
var jwtAccessToken = System.IdentityModel.Tokens.Jwt.JwtSecurityToken(access_token);

var client = new AmazonCognitoIdentityClient(new AnonymousAWSCredentials(),REGION);

var response = await client.GetCredentialsForIdentityAsync(new GetCredentialsForIdentityRequest
{
    IdentityId=String.Format("{0}:{1}", REGION, jwtAccessToken.id),
    Logins=new Dictionary<string,string> 
    { 
        {String.Format("cognito-idp.{0}.amazonaws.com/{1}", REGION, USER_POOL_ID),
         access_token}
    }
});

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-cognito


    【解决方案1】:

    要获取凭据,您可以通过传递 JWT 令牌来使用 GetCredentialsForIdentity 方法。该方法在 AWS Android SDK 的 AmazonCognitoIdentityClient 类中实现。

    IAM 角色应在 Cognito 联合身份中定义。这限制了代入角色在内部处理,因为 Cognito 不允许移动应用程序代入配置的角色之外的任何其他角色。此外,您不应授予此角色 IAM 权限,从而允许 Android SDK 承担不同的角色(除非它是正在登录的超级用户类型的用户)。

    【讨论】:

    • 我看不到GetCredentialsForIdentity API 如何接收 access_token?它需要一个类似于 Cognito 身份池 ID 的 IdentityId 和一个 Logins,这是输入用户名的方式(以及社交身份提供者的名称)。我没有那个登录信息。我所拥有的是 Cognito JWT access_token (docs.aws.amazon.com/cognito/latest/developerguide/…)
    • 在 Logins Map 中,您可以提供 JWT 令牌。
    • 我已经用实现您的建议的代码更新了我的问题,它会引发异常。您确定可以提供 access_tokens 来代替用户名吗?如果是这样,您为 IdentityId 指定什么?
    • Map logins = new HashMap(); logins.put("cognito-idp.us-east-1.amazonaws.com/us-east-1_123456678", '');
    • 这正是我所拥有的(尽管在我的情况下是用 C# 编写的,请参阅我更新的问题)。它在 IdentityId 而不是在登录时吠叫。 IdentityId 是什么,我只有身份池 id 和令牌。
    【解决方案2】:

    经过一番调查,我找到了答案。

    1- 需要 id_token 而不是 access_token 来向 Cognito 进行身份验证,这听起来可能具有误导性。 AWS 的文档说,当您需要拥有用户属性(如姓名/电子邮件等)时,您要求提供 id_token ......当您不需要该信息而只想进行身份验证时,要求提供 access_token 是错误的,或者至少具有误导性.

    2- 以下是使用 id-token 获取 AWS 凭证的方法:

    var credentials = CognitoAWSCredentials(<identity pool Id>, region);
    credentials.AddLogin(
        "cognito-idp.<region>.amazonaws.com/<user_pool_id>",
        id_token); // the raw token
    

    请注意,您不需要AssumeRoleWithIdentityGetCredentialsWithIdentity,甚至不需要AmazonCognitoIdentityClient

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2023-02-01
      • 2012-02-06
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2016-10-07
      • 2016-09-26
      相关资源
      最近更新 更多