AWS Cognito - 凭据问题

时间:2017-12-27 20:45:26

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

我正在尝试使用AWS Cognito进行身份验证(使用Google)并授权用户,以便为授权用户分配IAM角色。

到目前为止,我已按照以下步骤进行操作

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

      

    我正在使用" Grant flow"   我收到了诸如code=b3e8bca6-5a01-45db-b4c6-cd6900d0xxxx

    之类的内容
  2. 发出誓言/令牌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;
    });
    
  4.   

    我收到错误请求500错误

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

    几个问题

    1. 步骤顺序是否正确?
    2. 如何获得CongnitoUserId? id_token是一个非常长的字符串,但不确定我可以从中提取哪些信息?
    3. 最后,如何让accessKey进行AWS调用?
    4. 非常感谢任何帮助或指示。

      由于

1 个答案:

答案 0 :(得分:1)

  

步骤顺序是否正确?

我相信。

  

id_token是一个非常长的字符串,但不确定我可以从中提取哪些信息?

id_tokenaccess_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
}