【问题标题】:AWS Cognito - Credentials IssueAWS Cognito - 凭证问题
【发布时间】:2017-12-27 20:45:25
【问题描述】:

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

到目前为止,我一直遵循以下步骤

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

    我正在使用“赠款流程” 我收到了诸如code=b3e8bca6-5a01-45db-b4c6-cd6900d0xxxx

  2. 向 oath/token 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"
    
  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;
    });
    

我收到一个错误的请求 500 错误

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

几个问题

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

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

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-cognito federated-identity aws-java-sdk


    【解决方案1】:

    所遵循的步骤顺序是否正确?

    我相信。

    id_token 是一个很长的字符串,但不确定我可以从中提取什么信息?

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

    您可以将这些令牌粘贴到像this one 这样的解码器中,然后在浏览器中查看内容。在 javascript 中,atob() 按您的预期工作。

    我不确定您要使用什么用户 ID,但如果用户名足够,则 id_token 包含 cognito:username 密钥。

    最后我如何获得 accessKey 来进行 AWS 调用?

    在您的 Logins 映射中更改提供者。

    如果您直接与 Google 交谈,而不是通过 Cognito(通过 /oauth2/authorize)与 Google 交谈,您将在 Logins 映射中使用 accounts.google.com,如您的示例所示。

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

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

    【讨论】:

    • 谢谢!!我能够解码令牌并使用上面提到的 iss 键更正了登录映射,但我仍然收到相同的错误消息 {"__type":"NotAuthorizedException","message":"Invalid login token. Issuer doesn't match提供者名称"}。通过登录映射中的“令牌”,我假设您指的是 id_token。
    • 以下是我的 id_token 详细信息“身份”:[ {“userId”:“1068...”,“providerName”:“Google”,“providerType”:“Google”,“发行人”: null, //
    • 谢谢!终于设法让它工作了,我不得不从 iss 键中去掉 https://。
    • @maxkart 你为data.id_token 使用哪个令牌?
    • @TeddyKossoko 我不明白你的问题,.. 有 id、access 和 refresh 三个令牌 .. 我使用 id 作为用户详细信息和访问权限
    猜你喜欢
    • 2018-03-28
    • 2021-09-05
    • 2022-12-14
    • 2017-03-25
    • 2020-04-12
    • 2016-05-10
    • 2019-09-15
    • 2017-06-06
    • 2021-01-20
    相关资源
    最近更新 更多