我正在尝试使用AWS Cognito进行身份验证(使用Google)并授权用户,以便为授权用户分配IAM角色。
到目前为止,我已按照以下步骤进行操作
使用授权端点启动Google OAuth流程 http://docs.aws.amazon.com/cognito/latest/developerguide/authorization-endpoint.html
我正在使用" Grant flow" 我收到了诸如
之类的内容code=b3e8bca6-5a01-45db-b4c6-cd6900d0xxxx
发出誓言/令牌http://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html
的帖子请求我收到以下信息:
"id_token": "eyJraWQiOiJJR2NVdHJcL3pOa3pQK1lre...........",
"access_token": "eyJraWQiOiJCbWx0cjJvMnJlVGhHW..........",
"refresh_token": "eyJjdHkiOiJKV1QiLCJlbmMiOi............",
"expires_in": 3600,
"token_type": "Bearer"
尝试使用CognitoIdentityCredentials
获取AWS信用卡AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: environment.identityPoolId, // Federated ID eu-west-2:af47703f-350c-4018-ae6a-xxxxxx
RoleArn: environment.roleArn,// IAM role
Logins: { 'accounts.google.com': data.id_token },
});
AWS.config.getCredentials((error) => {
if(error) console.log("Error: ", error);
this.creds = AWS.config.credentials;
});
我收到错误请求500错误
{"__type":"NotAuthorizedException","message":"Invalid login token. Issuer doesn't match providerName"}
几个问题
id_token
是一个非常长的字符串,但不确定我可以从中提取哪些信息?非常感谢任何帮助或指示。
由于
答案 0 :(得分:1)
步骤顺序是否正确?
我相信。
id_token
是一个非常长的字符串,但不确定我可以从中提取哪些信息?
id_token
和access_token
都是JWT。您可以对点之间的字符串进行base64解码以提取令牌的内容。通常我们关注中间部分或有效负载。
您可以将这些令牌粘贴到this one之类的解码器中,然后在浏览器中查看内容。在javascript中,atob()
可以按照您的预期运行。
我不确定您使用的是哪个用户ID,但如果用户名足够,则id_token包含cognito:username
密钥。
最后,如何让accessKey进行AWS调用?
更改Logins
地图中的提供商。
如果您直接与Google通话,而不是通过Cognito与Google通话(通过/oauth2/authorize
),则可以在accounts.google.com
地图中使用Logins
,如您的示例所示。< / p>
但是,你要回来的代币来自Cognito,而不是Google。这两个令牌都包含iss
(颁发者)密钥,这很可能是您的用户池ID。这是您应该在Logins
地图中使用的值。假设发行者是您的用户池:
Logins: {
'cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxx': token
}