[当我们在Node中使用jsonwebtoken时,我们为用户签名特定令牌并将其发送回。但是,当我们在用户在头(Authentication: <token>)
中发送令牌时验证令牌时,jwt如何知道它正在验证的令牌是针对该特定用户的,而不是针对同样也在发送请求的其他用户时间?它是否将令牌存储在内部某个地方?
在登录时,您签署了一个令牌,其中payload是userId
,但只不过是查询的用户对象中的_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
[这里,我们将解码后的数据“附加”到用户对象,以便在对受保护的路由发出请求时,我们可以从请求对象中获取
userId
,例如req.user.userId
,然后对其进行查询从数据库中。
当您签署令牌时,您提供了一个payload,它可以是一个userId
和一个秘密。因此,令牌被签名。之后,您需要验证令牌,以防您尝试访问某些需要令牌的受保护页面。
因此,当您向受保护的路由发送请求时,如下所示:
router.get("/me", auth.verifyToken, usersController.identifyUser)
其中identifyUser
是控制器功能,它仅通过检查userId
来标识已登录的用户(请记住,用户对象包含已解码的对象数据)。
jwt怎么知道它正在验证的令牌是给那个特定用户的,而不是给其他同时发送请求的其他用户的?它是否将令牌存储在内部某个地方?
这是由于您提供的有效负载,这对于用户而言是唯一的。
也许对您有用?
从服务器发送令牌时,通常会使用用户ID对令牌进行签名。因此,当客户端随后发回该令牌时,您将其解码,它将把ID返回给您。然后用于在数据库中查找用户的对象
Authentication
令牌存储在认证服务器中,因此,当您在请求标头中发送Authentication
令牌时,认证服务器对客户端进行了认证。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9taXJvLm1lZGl1bS5jb20vbWF4LzIwMDAvMSpUQW9EM0tfZHpXZjltb3JhQVRDd2dnLnBuZyJ9>”
经过Authentication Server]认证后,客户端现在可以传递JWT来对Application Server
进行API调用。由于允许客户端进行API调用,因此Application Server可以验证客户端已发送的JWT令牌并可以处理API调用。请注意,对于进行API调用,客户端必须为每个API调用发送一个Authorization: Bearer <token>
,并将其存储在服务器(也称为授权服务器)中]
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9jZG4yLmF1dGgwLmNvbS9kb2NzL21lZGlhL2FydGljbGVzL2FwaS1hdXRoL2NsaWVudC1]