繁体   English   中英

令牌认证 - JWT

[英]Token Authentication - JWT

当我们在 Node 中使用 jsonwebtoken 时,我们会为用户签署一个特定的令牌并将其发回。 但是,当我们在用户在 header (Authentication: <token>)中发送令牌时验证令牌时,jwt 如何知道它正在验证的令牌是针对该特定用户而不是针对也发送了同时请求? 它是否将令牌存储在内部某个地方?

在登录时,您签署了一个令牌,其中有效负载userId ,它只不过是查询用户 object 中的_id字段。

loginUser: async (req, res, next) => {
    try {
      const { email, password } = req.body
      const user = await User.findOne({ email })
      const token = auth.signToken({ userId: user._id })
      res.status(200).json({ user, token })
    } catch (error) {
      return next(error)
    }
  }

auth.js

function signToken(payload) {
  return jwt.sign(payload, JWTSECRET)
}

function verifyToken(req, res, next) {
  const token = req.headers.Authorization || req.headers.authorization || ""
  if (!token) {
    return res.status(403).json({ error: "Not authorized" })
  }

  jwt.verify(token,JWTSECRET, (err, decodedObj) => {
    if (err) {
      return res.status(403).json({ error: "Not authorized" })
    }

    req.user = decodedObj
    next()
  })
}

module.exports = { signToken, verifyToken }


jwt.verify的回调中,您会得到一个decodedObj ,如下所示:

{ userId: '5edb3ae6d6b129183c1393bc', iat: 1591425786 }

其中iat是发布 jwt 的时间。


 req.user = decodedObj

在这里,我们将解码后的数据“附加”到用户 object 上,这样当对受保护路由发出请求时,我们可以从请求 object 中获取userId ,如req.user.userId ,然后从数据库。


当你签署一个令牌时,你提供了一个有效载荷,它可以是一个用户userId和一个秘密。 因此,令牌被签名。 之后,您需要验证令牌,以防您尝试访问需要令牌的受保护页面。

因此,当您向该受保护路由发送请求时,如下所示:

   router.get("/me", auth.verifyToken, usersController.identifyUser)

where identifyUser is a controller function that just identifies the logged in user by checking the userId (remember the user object contains the decoded object data).


jwt 如何知道它正在验证的令牌是针对该特定用户而不是针对同时发送请求的其他用户? 它是否将令牌存储在内部某个地方?

这是因为您提供的有效负载是用户独有的。

  1. 令牌最多存储在客户端中
  2. 当token验证成功时,我们会得到一些用户信息,比如account id,所以我们可以使用account id在数据库中查找更多的用户信息,并检查使用是否真的存在

也许它对你有用?

从服务器发送令牌时,您通常会使用用户 ID 对令牌进行签名。 因此,当客户端然后发送回该令牌时,您对其进行解码,它将返回 id 给您。 然后您可以使用它在数据库中查找用户

Authentication令牌存储在身份验证服务器中,因此当您在请求 header 中发送Authentication令牌时,身份验证服务器对您的客户端进行身份验证。

通过Authentication Server的身份验证后,客户端现在可以通过 JWT 对Application Server进行 API 调用。 由于允许客户端进行 API 调用, Application Server可以验证客户端已发送的 JWT 令牌并可以处理 API 调用。

请注意,为了进行 API 调用,客户端必须为每个 API 调用发送一个Authorization: Bearer <token> ,该调用存储在服务器(又名授权服务器)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM