Javascript 如何从前端从Cognito获取新令牌?

Javascript 如何从前端从Cognito获取新令牌?,javascript,reactjs,amazon-cognito,Javascript,Reactjs,Amazon Cognito,我有一个react应用程序,我正在使用Cognito来处理用户的身份验证。我需要知道如何使用刷新令牌调用Cognito,以便它返回一个新令牌 我查看了所有来自Cognito的例子,但它们都不起作用。他们正在使用我没有的依赖项,并且他们没有清楚地列出如何获得它们 有人能帮忙吗?从文档中可以看出,要将刷新令牌交换为访问令牌,您需要向令牌端点发出POST请求oauth2/token。请参阅此处的“将刷新令牌交换为令牌”一节: 您可以使用fetchapi简单地发出请求。这是上面的文件: 由于令牌请求涉及

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

我查看了所有来自Cognito的例子,但它们都不起作用。他们正在使用我没有的依赖项,并且他们没有清楚地列出如何获得它们


有人能帮忙吗?

从文档中可以看出,要将刷新令牌交换为访问令牌,您需要向令牌端点发出POST请求
oauth2/token
。请参阅此处的“将刷新令牌交换为令牌”一节:

您可以使用fetchapi简单地发出请求。这是上面的文件:

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

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

这里有一个例子:

在服务器端,您可以创建一个类似于
/api/aws/tokens/refresh
或类似的路由,它需要在请求主体中创建一个
refreshttoken
。然后该路由的控制器可以调用此方法:

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
}

在这个问题上,还有其他方法可以将服务器的工作与客户机的工作分开,还有许多需要配置的东西可以让这些都工作,但希望这对入门有所帮助。

您可以按照Henry的建议从头开始编写客户机,或者您可以使用一个库,这样就很好了

我们一直在使用这个软件包:


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

非常感谢你,亨利!在过去的几天里,我一直在努力解决这个问题。我真的很感谢你的回复。很抱歉,在你发布代码时,你的代码真的有效吗?当我开始处理这个问题时,我的代码和你的代码看起来是一样的。我在谷歌上苦苦搜寻了几个小时,直到我自己解决了这个难题,解决方案是将body作为查询字符串提供,而不是字符串化的JSON或FormData或其他任何东西。。。没有人提到这件事。“哪儿也没有!”耶戈奇克听到这个消息很难过。听起来这个问题也可以通过将内容类型标题设置为
application/x-www-form-urlencoded
来解决。它从一开始就是这样设置的:/Hmm,这个答案需要编辑,我会很快测试出来。Jedzej,我真的非常感谢你和Henry。你们帮了我大忙!也非常感谢你的帮助。