使用nodejs的网页中的JWT认证系统

时间:2017-02-16 04:32:11

标签: node.js reactjs authentication storage jwt

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

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

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

    感谢您抽出时间阅读本文

1 个答案:

答案 0 :(得分:4)

存储令牌:

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

退出用户

  • 是的,只是删除简单应用的作品。
  • 您应该指定 创建令牌时到期,当用户注销时,存储该令牌 数据库中的令牌(通常是Redis)
  • 每次用户发出请求时,请检查Redis中是否存储完全相同的令牌,如果是,则表示这是一个已注销的用户..将适当的响应返回给用户。
  • 运行一个cron作业,该作业将继续从Redis中删除过期的令牌,这样您的redis数据库就不会有过期的令牌,同时您的应用程序本身也会拒绝过期的令牌。

获取令牌后

执行您要执行的操作,令牌将包含您提供的信息,例如您选择的用户ID,名称和其他详细信息。基于此,您可以在前端显示不同的数据,并在后端查找用户特定的记录。

你没有遗漏任何东西,在基于令牌的身份验证中退出并不容易实现,基于令牌的身份验证的优点是你的应用程序不依赖于cookie,会话和你可以真正做出无状态分布式应用程序。

代码示例

这是我使用 localStorage Axios

的令牌的方式
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);

希望这有点帮助。