我有一个react应用,正在使用Cognito来处理用户的身份验证。我需要知道如何使用刷新令牌拨打Cognito的电话,这样它才能给我带来新的令牌?
我研究了Cognito的所有示例,但这些示例均无效。他们使用的是我所没有的依赖项,并且没有明确列出如何获取它们。
有人可以帮忙吗?
答案 0 :(得分:2)
从文档中,要用刷新令牌交换访问令牌,您需要向令牌端点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
}
还有其他方法可以将服务器与客户端的工作分开,以解决此问题,还需要进行许多配置以使所有工作正常进行,但是希望这对入门很有帮助。
答案 1 :(得分:0)
您可以按照Henry的建议从头开始编写客户端,也可以使用一个库,这很好。
我们一直在使用此软件包:https://www.npmjs.com/package/amazon-cognito-identity-js
效果很好。如果由于某些神秘的依赖关系问题而对您不起作用,请对此进行详细说明。也许我们会找出答案。