使用 nodejs 的网页中的 JWT 身份验证系统

JWT Authentication system in webpage using nodejs

最近我正在尝试构建一个带有管理面板的 JWT 身份验证系统来管理 login-ed 用户,目的很简单,例如 RESTFUL API 或实时数据库(Socket.io) 在移动设备或 web.But 中都有使用,几乎没有什么问题让我感到困惑。 现在的状态是我能够使用 nodejs 创建一个 JWT 令牌并将其传递到前端。 但是在那之后我不知道如何处理前端的那个令牌。下面是问题

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

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

这是我的 github 问题库 https://github.com/xylops/backend

感谢您花时间阅读本文

存储令牌:

使用localStorage存储令牌,所以即使用户 刷新页面令牌仍然存在。,您可以添加您的 axios header 的令牌,因此它会为您发出的每个请求传递。

注销用户:

  • 是的,只需删除简单应用即可。
  • 你应该指定 在创建令牌时过期以及在用户注销时存储它 数据库中的令牌(通常是 Redis)
  • 每次用户发出请求时,检查 Redis 中是否存储了完全相同的令牌,如果是,这意味着这是一个已注销的用户。return 对用户的正确响应。
  • 运行 一个 cron 作业,它将继续从 Redis 中删除过期的令牌,这样您的 Redis 数据库将不会有过期的令牌,同时您的应用程序本身将拒绝过期的令牌。

获得Token后

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

您并没有遗漏任何东西,在基于令牌的身份验证中注销并不容易实现,基于令牌的身份验证 的优点在于您的应用程序不依赖于cookies、session,你才能真正做到无状态的分布式应用。


代码示例

这就是我将令牌与 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 );
}

要解码您可以使用的令牌,JWT

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

希望对您有所帮助。