【问题标题】:How can I keep track of current user across my web app?如何在我的网络应用程序中跟踪当前用户?
【发布时间】:2021-07-23 11:42:44
【问题描述】:

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

【问题讨论】:

  • 使用 JWT 怎么样?你有研究过吗?
  • @DSPdav 我以为JWT只是为了认证,但它也可以存储用户ID?

标签: javascript node.js express authentication routes


【解决方案1】:

我这样做的方法如下:

  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"})
}

【讨论】:

  • 哦,我现在明白了。我没有意识到您可以在令牌中存储用户名,但我想这很有意义。谢谢
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多