当前位置: 首页 > 知识库问答 >
问题:

如何在给定AWS Cognito访问令牌的情况下获取AWSCredentials

洪通
2023-03-14

在Android应用程序中,我收到一个JWTaccess_token从超文本传输协议://

我应该用那个access_token调用什么API来获取一个AWSCre的对象。

我发现的最接近的一个是AssumeRoleAnd WebId,但那是一个STS应用编程接口,我在网上读到的一些内容似乎建议开发人员不要直接使用STS,而是依赖Cognito。

此外,我不希望需要指定角色名称的API。Cognito标识池已经配置为给经过身份验证的用户一个特定的角色。AssumeRoleWithWebIdentity将角色名称作为API的输入。因此,这看起来并不正确。

我已经查看了Cognito标识池API引用,但找不到一个使用access\u令牌并返回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}
    }
});

共有2个答案

卞俊贤
2023-03-14

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

IAM角色应该在Cognito联合身份中定义。通过Cognito不允许移动应用承担除配置的角色以外的任何其他角色,这限制了在内部处理假定角色。此外,您不应该授予此角色IAM权限,允许Android SDK承担不同的角色(除非是超级用户类型的登录用户)。

山凌
2023-03-14

经过大量调查,我找到了答案。

1-需要一个id_token而不是access_token来验证Cognito,尽管这听起来可能会误导。AWS的留档说,当你需要用户属性(如姓名/电子邮件等)时,你会要求id_token...当你不需要这些信息,只想进行身份验证时,要求access_token是错误的,或者至少是误导。

2-以下是如何使用id令牌获取AWS凭据:

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

请注意,您不需要assumerolewithidentitity,也不需要GetCredentialsWithIdentity,甚至不需要amazoncognitionidentityclient

 类似资料:
  • 当我使用自己的客户端id在浏览器中转到以下URL时: https://account-d.docusign.com/oauth/auth?response_type=token 我需要登录,然后我被重定向到:http://localhost:8888/auth#access_token=myAccessToken 现在我有一个节点。在js应用程序中,我想使用我的访问令牌进行API调用,直到现在,我

  • 在PHP中编码,我尝试初始化Spotify API,不使用重定向uri,只使用client_id和client_secret。我尝试下面的代码:从响应url中提取令牌-Spotify API,但我得到一个NULL结果 我想知道我是否可以在不要求用户登录的情况下访问令牌(参见https://developer.spotify.com/web-api/authorization-guide/#auth

  • 我有一个正在使用Azure AD身份验证的应用程序。我还需要访问Microsoft Graph API以获取用户数据。我发现的每个向Graph API发出请求的示例都使用了缓存的会话令牌,但由于我使用的是JWT,因此显然不需要存储会话状态。如何使用JWT将我的应用程序作为受众来获得具有适当受众的JWT? 例如,这里有一个从Microsoft Graph AspNetCore示例检索令牌的请求: 它

  • 下面是security.xml文件,我正在使用它合并spring-security-oauth2。 我必须在spring-security.xml文件中做哪些更改,以便在JSON中发送查询参数?

  • 获取访问令牌的文档中的第一步是“将用户引导到我们的授权URL”。那到底是什么意思?没有提供链接或任何东西。它还说“公司名称、联系电子邮件和隐私政策URL是开始提交的必要条件。”我们的应用程序没有隐私政策...只是一个简单的标签提要。我不明白为什么有一个简单的标签提要那么复杂。 是否有一个等待时间来获得批准的应用程序..如果它得到批准...在获得访问令牌之前,我必须获得批准吗?这在任何地方都没有概述

  • 我使用https://github.com/kunalvarma05/dropbox-php-sdk我的php项目上传文件在dropbox。 在这里,我不需要任何用户使用Dropbox,它只适用于内部用户,因此我可以在我的Dropbox上上传文件。 我从Dropbox应用程序生成了访问令牌,一切正常,但令牌在一段时间后过期。我做了一次 Oauth 登录以重新生成令牌,但新令牌在一段时间后也过期了。