如何使用Cognito返回的代码获取AWS凭据?

时间:2017-08-20 19:12:52

标签: javascript amazon-web-services aws-sdk amazon-cognito aws-cognito

现在,我正在努力了解AWS Cognito,所以也许有人可以帮助我。我设置了一个域,为我的用户池提供Cognito的托管用户界面,如here所描述的那样。因此,当我转到https://<my-domain>.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=<MY_POOL_CLIENT_ID>&redirect_uri=https://localhost:8080时,我会看到一个登录页面,我的用户可以通过Google登录我的应用。那部分工作得很好。

我很困惑如何处理用户登录后从该页面返回的代码。因此,一旦我被重定向到Google并授权应用程序查看我的信息,我就会被重定向回我的一个网址查询参数中的代码。现在我正在重定向到localhost,因此重定向URL如下所示:

https://localhost:8080/?code=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX

这段代码究竟是什么?另外,如何使用它来为我的用户访问AWS资源?

5 个答案:

答案 0 :(得分:6)

要从授权代码oath2流程返回的代码请求参数中获取AWS凭据(id_token,access_token和refresh_token),您应该按照https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html指示使用您的Cognito用户池Web域/oauth2/token端点

请注意HTTP基本授权用户和密码说明,它应该是您的Cognito App client_idclient_secret,否则会出现invalid_client错误。

代码流应该在服务器端使用,因为您可以避免在URL上浮动的令牌。如果您计划执行该客户端,则应使用response_type=token,因为它会直接在登录重定向上提供此结果。

答案 1 :(得分:3)

首先,进行一千次螺丝验证。没有人值得花半天时间看看这种狗屎。

使用Cognito授权的API网关的身份验证

成分

  1. client_idclient_secret:在Cognito>常规设置>应用程序客户端中,您可以找到应用程序客户端ID,然后单击显示详细信息以找到应用程序客户端密码

  2. 对于标头Authorization: Basic YWJjZGVmZzpvMWZjb28zc...,您需要使用Base64Encode(client_id:client_secret)对这两个编码,例如在Python中:

    import base64  
    base64.b64encode('qcbstohg3o:alksjdlkjdasdksd')`  
    

    旁注:Postman也可以选择在授权> 基本身份验证

    中生成此消息
  3. redirect_uri:在正文中传递,它是您在应用集成>应用客户端设置中配置的回调网址。
    这必须与您配置的内容相匹配,否则您将获得完全 毫无帮助的消息{ "error": "invalid_grant" }

从代码中获取令牌的请求示例:

curl --location --request POST 'https://mycognitodomain.auth.us-east-1.amazoncognito.com/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic <base64 encoded client_id:client_secret>' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=<client_id>' \
--data-urlencode 'code=<use the code you received post login>' \
--data-urlencode 'redirect_uri=https://myapp.com'

这将返回您的令牌:

{
  "access_token":"eyJz9sdfsdfsdfsd", 
  "refresh_token":"dn43ud8uj32nk2je",
  "id_token":"dmcxd329ujdmkemkd349r",
  "token_type":"Bearer", 
  "expires_in":3600
}

然后使用id_token并插入您的API调用:

curl --location --request GET 'https://myapigateway.execute-api.us-east-1.amazonaws.com/' \
--header 'Authorization: <id_token>'

答案 2 :(得分:2)

不确定自问问起10个月后是否有用,但可能对其他人有帮助。

我已经使用response_type = token(Oauth flow ='隐式授予'&scope ='openid')和提供者作为Cognito。使用默认登录页面登录后,您将获得一个“ id_token”和“ access_token”。您可以使用此“ id_token”获得用户的临时身份。您还需要为此设置联合身份池,为身份验证和未经身份验证的用户分配角色,并链接到要进行身份验证的用户池。有了这些代码后(假设您使用的是javascript),您可以按照Cognito user identity pools javascript examples的示例进行操作。我的示例代码是从同一代码派生的-

function getAccessToken(idToken, identityPoolId, userPool) {
        let provider = "cognito-idp.us-east-2.amazonaws.com/" + userPool;
        let login = {};

        login[provider] = idToken;

        // Add the User's Id Token to the Cognito credentials login map.
        let credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: identityPoolId,
            Logins: login
        });

        //call refresh method in order to authenticate user and get new temp credentials
        credentials.get((error) => {
            if (error) {
                console.error(error);

                let response = {
                    statusCode: 500,
                    body: JSON.stringify(error)
                };

                return response;

            } else {
                console.log('Successfully logged!');
                console.log('AKI:'+ credentials.accessKeyId);
                console.log('AKS:'+ credentials.secretAccessKey);
                console.log('token:' + credentials.sessionToken);

                let response = {
                    statusCode: 200,
                    body: JSON.stringify({
                        'AKI': credentials.accessKeyId,
                        'AKS': credentials.secretAccessKey,
                        'token': credentials.sessionToken
                    })
                };

                return response;
            }
        });
    }

希望这会有所帮助。

答案 3 :(得分:1)

您可以找到&#34;授权代码授予&#34;在文档中:http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html

答案 4 :(得分:0)

简单来说,您可以使用代码和Cognito clientId +主机名来请求ID /访问/刷新令牌,然后使用ID和访问令牌在API调用中识别用户。