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

时间:2018-09-24 14:49:30

标签: javascript reactjs amazon-cognito

我有一个react应用,正在使用Cognito来处理用户的身份验证。我需要知道如何使用刷新令牌拨打Cognito的电话,这样它才能给我带来新的令牌?

我研究了Cognito的所有示例,但这些示例均无效。他们使用的是我所没有的依赖项,并且没有明确列出如何获取它们。

有人可以帮忙吗?

2 个答案:

答案 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

效果很好。如果由于某些神秘的依赖关系问题而对您不起作用,请对此进行详细说明。也许我们会找出答案。