【发布时间】:2021-03-20 17:55:58
【问题描述】:
我正在更改身份验证以处理仍处于开发阶段的网站上的过期问题。 (因此现在可以完全控制更改)。这就是我目前拥有的(伪代码)。我已经包含了 4 条路由,数据库当前包含 userToken(用户的 id)、userSecret(用户注销时的更改)
SignUpRoute.post('/signup', (req, res) => {
//Save userdetails, userToken, userSecret in DB
}
BidderRoute.post('/logout', userAuth, (req, res) => {
find account with matching email
update db.userSecret
response success
}
userRoute.post('/login', (req, res) => {
if req.body.email === db.email
if req.body.password === db.password(hashed)
response (db.userToken, db.userToken) //can this be a cookie?
ProductRoute.post('/data', userAuth, (req, res) => {
// some action here
}
userAuth middleware:
req.body.userSecret, req.body.userToken from body
fetch db collection where req.body.userToken === db.userToken
if userToken !== db.userToken && userSecret !==db.userSecret then error (401) - redirect to login
next()
我需要添加一个过期时间以防止用户登录超过 30 分钟,所以我想我应该在集合中添加一个过期字段并更改 /login 路由和中间件:
userRoute.post('/login', (req, res) => {
if req.body.email === db.email
if req.body.password === db.password(hashed)
updated and save db.userSecret
updated and save db.expiryDate //30mins
response (db.userToken, db.userToken) //can this be a cookie?
ProductRoute.post('/data', userAuth, (req, res) => {
// some action here
}
userAuth middleware:
req.body.userSecret, req.body.userToken from body
fetch db collection where req.body.userToken === db.userToken
if now > db.expiryDate then error (401) - redirect to login
if userToken !== db.userToken && userSecret !==db.userSecret then error (401) - redirect to login
if db.expiryDate < 2mins remaining then renew db.expiryDate (save in db)
next()
第一季度。在我实施之前,我想知道我是否遗漏了步骤中的任何明显内容。
第二季度。目前,前端将 userSecret 和 User 令牌存储在本地存储中,服务器发送带有 userToken 和 userSecret(不是 cookie)的 200 响应(参见 /login)。如果我想将这些数据保存在 FE 的 cookie 中,上面的代码应该发送一个 cookie 还是 FE 可以将响应保存为 cookie 无关紧要?
更新 - 如果我要使用 cookie - 因为 cookie 有一个过期时间,我想我可以使用它而不是尝试在 db 中保持过期时间。下面的工作吗?
userRoute.post('/login', (req, res) => {
if req.body.email === db.email
if req.body.password === db.password(hashed)
updated and save db.userSecret
send cookie (with userSecret, userToken) with 30mins expiry
ProductRoute.post('/data', userAuth, (req, res) => {
Refresh cookie here ?
}
userAuth middleware:
If cookie received //i.e. not expired
else re-direct to /login
Parse userSecret, userToken from COOKIE
fetch db collection where req.body.userToken === db.userToken
if userToken !== db.userToken && userSecret !==db.userSecret then error (401) - redirect to login
if db.expiryDate < 2mins remaining then renew db.expiryDate (save in db)
next()
【问题讨论】: