AWS Cognito - 凭证问题

AWS Cognito - Credentials Issue

我正在尝试使用 AWS Cognito 对用户进行身份验证(使用 Google)和授权,目的是为授权用户分配 IAM 角色。

到目前为止我已经按照以下步骤操作

  1. 使用授权端点启动Google OAuth 进程 http://docs.aws.amazon.com/cognito/latest/developerguide/authorization-endpoint.html

    I am using "Grant flow" I receive a such as code=b3e8bca6-5a01-45db-b4c6-cd6900d0xxxx

  2. 向 oath/token http://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

    发出 post 请求

    I receive the following information:

    "id_token": "eyJraWQiOiJJR2NVdHJcL3pOa3pQK1lre...........",
    "access_token": "eyJraWQiOiJCbWx0cjJvMnJlVGhHW..........",
    "refresh_token": "eyJjdHkiOiJKV1QiLCJlbmMiOi............",
    "expires_in": 3600,
    "token_type": "Bearer"
    
  3. 尝试使用 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;
    });
    

I get a bad request 500 error

{"__type":"NotAuthorizedException","message":"Invalid login token. Issuer doesn't match providerName"}

几个问题

  1. 步骤顺序是否正确?
  2. 如何获得 CongnitoUserId? id_token 是一个很长的字符串,但不确定我可以从中提取什么信息?
  3. 最后,如何获得 accessKey 以进行 AWS 调用?

任何帮助或指导将不胜感激。

谢谢

Is the sequence of steps followed correct?

我相信是的。

id_token is a very long string, but not sure what information can I extract from it?

id_tokenaccess_token 都是 JWT。您可以对点之间的字符串进行 base64 解码以提取令牌的内容。通常我们关注中间部分,或 payload.

您可以将这些标记粘贴到解码器中,就像 this one, and view the contents in your browser. In javascript, atob() 一样工作。

我不确定您要查找的用户 ID,但如果用户名足够,id_token 包含一个 cognito:username 键。

Finally how to I get accessKey to make AWS calls?

更改 Logins 地图中的供应商。

如果您直接与 Google 交谈,而不是通过 Cognito(通过 /oauth2/authorize)与 Google 交谈,您将在 Logins 地图如您的示例所示。

但是,您取回的令牌来自 Cognito,而不是来自 Google。两个令牌都包含一个 iss(发行者)密钥,这很可能是您的用户池 ID。这是您应该在 Logins 映射中使用的值。假设发行人是您的用户池:

Logins: {
    'cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxx': token
}