Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Cognito返回的代码获取AWS凭据?_Javascript_Amazon Web Services_Aws Sdk_Amazon Cognito_Aws Cognito - Fatal编程技术网

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

Javascript 如何使用Cognito返回的代码获取AWS凭据?,javascript,amazon-web-services,aws-sdk,amazon-cognito,aws-cognito,Javascript,Amazon Web Services,Aws Sdk,Amazon Cognito,Aws Cognito,现在,我正在努力理解AWS Cognito,也许有人能帮我。我设置了一个域来为我的用户池提供Cognito的托管UI,如所述。所以当我进入https://.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=&redirect_uri=https://localhost:8080我得到了一个登录页面,我的用户可以通过谷歌登录到我的应用程序。那部分工作得很好 我不知道在用户登录后如何处理从该页面返回的代码。因此,一

现在,我正在努力理解AWS Cognito,也许有人能帮我。我设置了一个域来为我的用户池提供Cognito的托管UI,如所述。所以当我进入
https://.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=&redirect_uri=https://localhost:8080
我得到了一个登录页面,我的用户可以通过谷歌登录到我的应用程序。那部分工作得很好

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

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

这个代码到底是什么?另外,我如何使用它来访问我的用户的AWS资源?

您可以在文档中找到“授权代码授权”:

从授权代码流返回的代码请求参数中获取AWS凭据(id\u令牌、access\u令牌和refresh\u令牌),您应该按照说明使用您的Cognito用户池web域
/oauth2/token
端点

请注意HTTP基本授权用户和密码说明,它应该是您的Cognito应用程序
客户端id
客户端机密
,否则,您将收到
无效客户端
错误


代码流应该用于服务器端,因为您可以避免标记在URL上四处浮动。如果您计划在客户端执行此操作,您应该使用
响应\u type=token
,因为它会直接在登录重定向上给出此结果。

不确定这是否会在请求后的10个月内有用,但可能会对其他人有所帮助

我使用了
response\u type=token
(Oauth flow=
implicit grant
&scope=
openid
)和提供者作为
Cognito
。使用默认登录页面登录后,您将获得一个
id\u令牌
&
access\u令牌
。您可以使用此
id\u令牌为您的用户获取临时身份。您还需要为此设置一个联合身份池,为经过身份验证和未经身份验证的用户分配角色,并链接到您正在进行身份验证的用户池。一旦您拥有了这个功能(假设您使用的是javascript),您就可以在上遵循这个示例。我的示例代码派生自相同的-

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;
            }
        });
    }
希望这能有所帮助。

首先,请将身份验证搞得一团糟。没人值得花半天的时间看这狗屎

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

成分

  • client\u id
    client\u secret
    :在Cognito>General Settings>App client中,您可以找到App client id,然后单击Show Details以查找App client secret

  • 对于头文件
    授权:Basic YWJjZGVmZzpvMWZjb28zc…
    您需要使用
    Base64Encode(client\u id:client\u secret)
    对这两个文件进行编码,例如在Python中:

    import base64  
    base64.b64encode('qcbstohg3o:alksjdlkjdasdksd')`  
    
    旁注:邮递员还可以在授权>Basic Auth

  • redirect\u uri
    :在正文中传递,它是您在App integration>App client settings中配置的回调url。
    这必须与您的配置相匹配,否则您将得到一个完整的配置 无效消息
    {“错误”:“无效授权”}

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

    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'
    
    然后使用
    id\u令牌
    并插入API调用:

    curl --location --request GET 'https://myapigateway.execute-api.us-east-1.amazonaws.com/' \
    --header 'Authorization: <id_token>'
    
    curl--location--request GET'https://myapigateway.execute-api.us-east-1.amazonaws.com/' \
    --标题“授权:”
    
    简单地说,您可以使用代码和Cognito clientId+主机名请求id/access/refresh令牌,然后使用id和access令牌在您的API调用中标识用户。

    嗯,我读过了,并了解了如何使用此处描述的端点:。我猜我以为SDK中有某种东西可以帮我处理这个问题。所以我听到的基本上是,我应该坚持使用
    response\u type=code
    query参数作为我的登录页面。一旦用户得到指示,使用该方法将令牌放置在URL中。看来不是这样,就是我必须自己申请代币。你觉得这对吗?我想说的是“我应该坚持使用
    response\u type=token
    ”我仍然对文档感到困惑。我可以用令牌交换代码吗?在我看来,文档中的术语正在发生变化。我用“代码”调用SDK中的什么方法来获取用户信息?嗨,我也有同样的问题,我想问一下“默认登录”是什么意思。它是AWS提供的域吗?因为似乎只有当您选择“授权码授权”作为OAuth流时,您才能使用该网站(这意味着,如果我理解正确,您将获得一个代码而不是令牌)。是的,当您在Cognito上配置域时,您获得(或基于格式创建)的登录URL。它还与
    隐式授权
    一起使用。这是一个适合我的-
    https://exampledomain.auth.us-east-2.amazoncognito.com/login?response_type=token&client_id=xxxxx&redirect_uri=http://localhost/portal.html
    如何将Cognito用户池中重定向URL的
    response\u type
    设置为
    token
    重定向URL,但在初始URL请求中。请参阅我的cognito示例应用程序,您正在使用授权代码流。在此流中,托管UI(在用户浏览器中运行)将根据Cognito用户池对用户进行身份验证,并返回授权代码。然后必须将此代码发送到Web服务器。你的网络服务器
    curl --location --request GET 'https://myapigateway.execute-api.us-east-1.amazonaws.com/' \
    --header 'Authorization: <id_token>'