令牌认证-JWT

问题描述 投票:1回答:4

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

javascript node.js express jwt jwt-auth
4个回答
1
投票

在登录时,您签署了一个令牌,其中payloaduserId,但只不过是查询的用户对象中的_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怎么知道它正在验证的令牌是给那个特定用户的,而不是给其他同时发送请求的其他用户的?它是否将令牌存储在内部某个地方?

这是由于您提供的有效负载,这对于用户而言是唯一的。


0
投票
  1. 令牌存储在客户端中最多
  2. 当令牌成功验证后,我们将获得一些用户信息,例如帐户ID,因此我们可以使用帐户ID在数据库中查找更多用户信息,并检查使用情况是否确实存在

也许对您有用?


0
投票

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


0
投票

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]

© www.soinside.com 2019 - 2024. All rights reserved.