javascript - 如何在我的网络应用程序中跟踪当前用户?
问题描述
我正在尝试创建一个与社交媒体平台相似的网络应用程序。我的后端是 MongoDB (Mongoose)、Express.js 和 Node.js。对于路由,我需要跟踪当前用户的用户名,以便我可以使用像 example.com/username 这样的 api 路由来获取他们的个人资料。问题是我无法知道当前用户的用户名是什么。我考虑过使用 cookie,但这似乎很不安全(我可能是错的)。我也考虑过使用会话,但我读到它们效率不高,也不能很好地扩展。那么我怎样才能有效地做到这一点呢?
解决方案
我这样做的方式如下:
- 身份验证后,我为用户提供了一个承载令牌,其中包含他/她的用户 ID。
- 用户必须在所有后续经过身份验证的请求中提供此令牌。
- 使用中间件验证令牌并将用户附加到请求中。
登录时
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"})
}
推荐阅读
- spartacus-storefront - Spartacus:购物车 API 参数中的货币代码错误
- django - 检查图像是否存在于 Django 模板中
- colors - 如何将 DeviceRGB 转换为 System.Drawing.Color?
- python-3.x - 试图将列表的元素向右移动 U 但输出在 python 中全为零
- javascript - React setstate on an array value 修改数组常量的值
- spring-data-couchbase - 春季数据 CouchBase deleteAllByXXId 或 deleteByXXIdis 不起作用
- charts - 如何将重置缩放按钮和标题设置为高图表的中心
- java - 如何对字符串集合的集合进行排序?
- cmake - 如何从 cmake 运行复合脚本语句?
- ios - HealthKit - 在 HKWorkoutSession 期间更改 HKWorkoutConfiguration?