javascript - 如何从前端从 Cognito 获取新 token ?

标签 javascript reactjs amazon-cognito

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

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

有人可以帮忙吗?

最佳答案

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

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

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

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

这是一个例子:

在服务器端,您可以制作一个像 /api/aws/tokens/refresh 或类似的路由,它需要在请求正文中有一个 refreshToken。然后该路由的 Controller 可以调用此方法:

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
}

在这个问题上,还有其他方法可以将服务器和客户端的工作分开,并且可以配置很多东西来使这一切正常工作,但希望这对入门有所帮助。

关于javascript - 如何从前端从 Cognito 获取新 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52481976/

相关文章:

javascript - 如何根据用户输入检索并设置该月的最后一天?

node.js - 实时应用对 pod 代码源的更改 - npm

amazon-web-services - AWS 认知 : email unverified on main account after AdminLinkProviderForUser

python - 如何使用 boto3 为 AWS Cognito 创建 SECRET_HASH?

javascript - 在 ng-repeat 子级之一中执行方法

javascript - Ember Array 调用 get 就返回 findBy 返回未定义

javascript - 在 Reactjs 中出现错误。它说未处理的拒绝(TypeError)。但我已经告诉它如果用户在输入中输入无效名称该怎么办

javascript - 处理按钮选择+将所选项目添加到新数组

reactjs - AWS Amplify 用户 session 不会在 ReactJS 中过期

javascript - 使用 link_to 将 div 替换为 rails