node.js - 使用nodejs在网页中使用JWT身份验证系统

标签 node.js reactjs authentication storage jwt

最近,我正在尝试构建一个带有管理面板的 JWT 身份验证系统,以管理登录用户,以实现简单的目的,例如在移动或网络中使用的 RESTFUL API 或实时数据库(Socket.io)。但是很少有问题这让我绊倒。 现在的状态是我能够使用nodejs创建一个JWT token 并将其传递到前端。 但是之后我不知道如何处理前端的该 token 。这是问题

  1. 如果我使用 React、Redux 或 ReactNative,是否可以将 token 保存在 Redux 状态,并通过 ajax(Axios) 请求调用它,如果不是应该存储在哪里?
  2. 如果我只是想使用 HTML 而不是任何类型的单页应用程序框架,我应该在哪里存储 token (本地存储、cookie、窗口 sessionStorage,还有其他什么?)
  3. 我听说 session 和 cookie 不是存储 token 的好位置,因为它们容易受到不同的攻击,我该如何防止这种情况?
  4. 这是我遇到的最大问题,我创建了一个表单供用户登录,按下登录按钮后,收到 token 后我将执行一个ajax请求来请求 token ,我应该如何保存 token (根据 q2)并通过设置 header {'x-access-token': token} 将用户重定向到 protected 路由?
  5. 如果我想允许用户注销,正确的方法是什么? (只是从客户端存储中删除 token ?)
  6. 我找到了很多关于创建和刷新 token 的教程,但我找不到任何关于获取 token 后该怎么做的教程?有什么好的建议我可以遵循吗?
  7. 我知道这很奇怪,但我觉得我缺少整个身份验证流程的一些核心概念。有人可以根据我上面提出的问题尝试指出一下吗?

抱歉我的英语不好,我已尽力以正确的方式表达它。

这是我的 github 存储库,用于解决问题 https://github.com/xylops/backend

感谢您花时间阅读本文

最佳答案

存储 token :

使用localStorage来存储 token ,所以即使用户 刷新页面, token 仍然存在。,您可以添加您的 token 到 axios header,以便您发出的每个请求都会传递它。

注销用户:

  • 是的,只需删除简单应用即可。
  • 您应该指定 创建 token 时过期以及用户注销时,存储该 token 数据库中的 token (通常是 Redis)
  • 每次用户发出请求时,都会检查 Redis 中是否存储了完全相同的 token ,如果是,则表示这是一个已注销的用户。向用户返回正确的响应。
  • 运行一个 cron 作业,该作业将继续从 Redis 中删除过期的 token ,这样您的 Redis 数据库就不会包含过期的 token ,同时您的应用本身将拒绝过期的 token 。

获取Token后

做你想做的事, token 将包含你提供的信息,如用户 ID、姓名和你选择的其他详细信息,基于此你可以在前端显示不同的数据并在后端查找用户特定记录。

您不会错过任何东西,在基于 token 的身份验证中注销并不容易实现,基于 token 的身份验证的优点在于您的应用程序不依赖于 cookie、 session 和您才能真正做出无状态的分布式应用。

<小时/>

代码示例

这就是我将 token 与localStorageAxios一起使用的方式

import axios from 'axios';

const setToken = (token) => {
    // if token is provided, save it in localStorage and add it to axios header as well.
    if ( token ) {
        localStorage.token = token
        axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
    }
    // if token is empty, just remove it from localStorage and axios..
    // set empty token when you logout the user.
    else {
        delete localStorage.token;
        delete axios.defaults.headers.common['Authorization'];
    }
}

当应用程序第一次加载时以及每次刷新时执行

if ( localStorage.token ) {
    setToken( localStorage.token );
}

要解码您可以使用的 token ,JWT

import jwt from 'jsonwebtoken';
const decodedToken = jwt.decode(localStorage.token);

希望这会有所帮助。

关于node.js - 使用nodejs在网页中使用JWT身份验证系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265015/

相关文章:

node.js - MongoDB 和 Mongoose 的区别

mysql - 在nodejs查询之外显示mysql结果以供稍后使用

javascript - VS Code 在 React 测试用例中使用 require 语法导入

amazon-web-services - 如何使用 Facebook 验证 API Gateway 调用?

session - 是否可以将 HTTP header 添加到 Socket.io 握手中?

node.js - 谷歌 OAuth2 : Required parameter is missing: grant_type

javascript - 在 node.js 中协调并行执行

javascript - 通过 .catch() 传播被拒绝的 promise

reactjs - React-redux:如何将 redux 表单 Prop 冒泡到父组件

javascript - 单元测试 - 通量和数据持久性