如何存储JWT并使用react发送每个请求

Mai*_*rix 10 express jwt reactjs passport.js react-router

很高兴知道因为我的基本注册/认证系统正在进行中.

所以我基本上得到了这个:

app.post('/login', function(req,res) {
 Users.findOne({
email: req.body.email
}, function(err, user) {
if(err) throw err;

if(!user) {
  res.send({success: false, message: 'Authentication Failed, User not found.'});
} else {
  //Check passwords
  checkingPassword(req.body.password, user.password, function(err, isMatch) {
    if(isMatch && !err) {
      //Create token
      var token = jwt.sign(user,db.secret, {
        expiresIn: 1008000
      });
      res.json({success: true, jwtToken: "JWT "+token});
    } else {
      res.json({success: false, message: 'Authentication failed, wrong password buddy'});

       }
     });
    }
 });
});
Run Code Online (Sandbox Code Playgroud)

然后我保护我的/ admin路由和POSTMAN,每当我发送一个带有jwt的get请求时,一切都运行正常.

现在这里是棘手的部分,基本上当我要登录如果这是一个成功然后重定向我到管理页面,每次我尝试访问管理员/*路线我想发送到服务器我的jwToken但问题是,我该怎么做?我没有使用redux/flux,只使用react/react-router.

我不知道机械师的工作原理.

多谢你们

ita*_*312 29

不要将令牌存储在 localStorage 中,令牌可能会被 xss 攻击破坏。我认为最好的解决方案是在登录操作时向客户端提供访问令牌和刷新令牌。将访问令牌保存在内存中(例如 redux 状态),并且应该在服务器上使用 httpOnly 标志(如果可能,还可以使用安全标志)创建刷新令牌。访问令牌应设置为每 2-3 分钟过期一次。为了确保用户不必每 2-3 分钟输入一次他的凭据,我有一个时间间隔,它/refreshToken在当前令牌到期之前调用端点(静默刷新令牌)。

这样,访问令牌就不会被使用 xss/csrf 破坏。但是使用 xss 攻击,攻击者可以代表您调用/refreshToken端点,但这不会有害,因为返回的令牌不会受到损害。

  • 现在我正在使用另一种解决方案,它不那么痛苦但足够安全。在服务器端,我将 jwt 分成两部分。一个包含有效负载和标头,另一个仅包含签名。我将第一部分存储在具有相同站点标志的 cookie 中,将第二部分存储在也具有 SameSite 的 httpOnly cookie 中。当服务器收到请求时,它会获取 cookie 并重新组装 jwt,然后检查其有效性。我还作为请求标头发送另一个用户标识符(如用户 ID),并且该用户 ID 也在 jwt 签名中加密,因此它是另一个保护层 (4认同)

Tie*_*yen 8

1-登录组件向API服务器端点发送登录请求

2-服务器API端点返回令牌

3-我将令牌保存在用户的localStorage中

4-从现在开始所有的API调用都将包含在标题中

示例:https//github.com/joshgeller/react-redux-jwt-auth-example

  • 不建议将令牌放入LocalStorage。参见:https://dev.to/rdegges/please-stop-using-local-storage-1i04 (5认同)
  • 建议不要将 JWT 放入本地存储是非常有争议的。正如 @Dan 文章中的一些评论所指出的,这实际上非常好。如果有人能够在您的网站上执行恶意 JS 代码,本地存储将是您最不用担心的...请阅读本文的评论,因为文章本身并没有公正地对待它 (4认同)
  • @Dan 那么推荐什么? (2认同)
  • 让您的服务器将JWT令牌另存为HttpOnly cookie。浏览器将处理其余部分。如果您的前端正在对令牌发出CORS请求,则需要为AJAX请求设置withcredentials标志。 (2认同)