【问题标题】:How to get new token from Cognito from the frontend?如何从前端从 Cognito 获取新令牌?
【发布时间】:2019-02-28 02:54:45
【问题描述】:

我有一个反应应用程序,我正在使用 Cognito 来处理用户的身份验证。我需要知道如何使用刷新令牌调用 Cognito,以便它返回一个新令牌?

我查看了 Cognito 中的所有示例,但它们都不起作用。他们正在使用我没有的依赖项,并且没有明确列出如何获取它们。

有人可以帮忙吗?

【问题讨论】:

    标签: javascript reactjs amazon-cognito


    【解决方案1】:

    根据文档,要将刷新令牌交换为访问令牌,您需要向令牌端点 oauth2/token 发出 POST 请求。请参阅此处的“用刷新令牌交换令牌”部分:https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

    您可以使用 Fetch API 简单地发出请求。这是上面的文档:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

    由于令牌请求涉及将您的客户端 ID 和客户端密码发送到 AWS cognito,因此我建议不要直接在 React 中发出此请求。如果您确实在 React 中这样做了,那么有人可能会找到您的客户端 ID 和客户端密码,并发出看起来像是来自您的应用程序的请求。

    相反,您应该让 React 要求您的服务器发出请求并返回它收到的响应。

    这是一个例子:

    在服务器端,您可以创建类似/api/aws/tokens/refresh 或类似的路由,它要求请求正文中包含refreshToken。然后该路由的控制器可以调用此方法:

    async getAccessToken(refreshToken) {
        const endpoint = 'https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token';
        const options = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Authorization': `Basic ${btoa(CLIENT_ID:CLIENT_SECRET)}`
            },
            body: JSON.stringify({
                grant_type: 'refresh_token',
                client_id: CLIENT_ID,
                refresh_token: refreshToken
            })
        }
        const response = await fetch(endpoint, options);
        return response;
    }
    

    请注意,授权使用方法btoa,该方法对其输入进行base64编码。

    在客户端,你的 React 应用可以像这样调用你的服务器:

    async getAccessToken(refreshToken) {
        const endpoint = '/api/aws/tokens/refresh';
        const options = {
            method: 'POST',
            body: JSON.stringify({
                refreshToken: refreshToken
            })
        }
        const response = await fetch(endpoint, options);
        // store the tokens or return them
    }
    

    还有其他方法可以将您的服务器的工作与客户端的工作分开来解决这个问题,并且需要配置许多东西才能让这一切正常工作,但希望这对开始有所帮助。

    【讨论】:

    • 非常感谢亨利!在过去的几天里,我一直在为此苦苦挣扎。非常感谢您的回复。
    • 很抱歉,您的代码在您发布时确实有效吗?当我开始与这件事作斗争时,我的代码看起来和你的一模一样。我在谷歌上苦苦挣扎了几个小时,直到我自己解决了这个难题,解决方案是提供正文作为查询字符串,而不是字符串化的 JSON 或 FormData 或其他任何东西......没有人提到这一点。无处可去。
    • @yegorchik 很遗憾听到这个消息。听起来问题也可以通过将内容类型标头设置为 application/x-www-form-urlencoded 来解决。
    • 从一开始就是这样设置的:/
    • 嗯,这个答案需要修改,我会尽快测试。
    【解决方案2】:

    您可以按照 Henry 的建议从头开始编写客户端,也可以使用库,一切顺利。

    我们一直在使用这个包:https://www.npmjs.com/package/amazon-cognito-identity-js

    它工作得很好。如果由于某些神秘的依赖问题而对您不起作用,请详细说明一下。也许我们会弄清楚的。

    【讨论】:

    • Jedzej,我非常感谢你和亨利。你们帮了我很大的忙!也非常感谢您的帮助。
    猜你喜欢
    • 2020-12-13
    • 2019-05-20
    • 2018-06-28
    • 2019-07-28
    • 2018-12-09
    • 2019-04-23
    • 2019-03-23
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多