首页 > 解决方案 > 如何在我的网络应用程序中跟踪当前用户?

问题描述

我正在尝试创建一个与社交媒体平台相似的网络应用程序。我的后端是 MongoDB (Mongoose)、Express.js 和 Node.js。对于路由,我需要跟踪当前用户的用户名,以便我可以使用像 example.com/username 这样的 api 路由来获取他们的个人资料。问题是我无法知道当前用户的用户名是什么。我考虑过使用 cookie,但这似乎很不安全(我可能是错的)。我也考虑过使用会话,但我读到它们效率不高,也不能很好地扩展。那么我怎样才能有效地做到这一点呢?

标签: javascriptnode.jsexpressauthenticationroutes

解决方案


我这样做的方式如下:

  1. 身份验证后,我为用户提供了一个承载令牌,其中包含他/她的用户 ID。
  2. 用户必须在所有后续经过身份验证的请求中提供此令牌。
  3. 使用中间件验证令牌并将用户附加到请求中。

登录时

const token = jwt.sign({ _id: user.id.toString() }, 'secret')
user.tokens = user.tokens.concat( { token } )
await user.save()

将此令牌与响应一起发送并存储在数据库中。

在身份验证中间件中做这样的事情

try {
    const token = req.header('Authorization').replace('Bearer ', '')
    const decoded = jwt.verify(token,'secret')
    const user = await User.findOne({_id: decoded._id, 'tokens.token' :token})
    if(!user) {
        throw new Error()
    } 
    //attach the token and the user upon the request
    req.token = token
    req.user = user
    next()
} catch (e) {
    res.status(401).send({error : "Authentication Required"})
}

推荐阅读