[英]Authentication for website and adding an expiry
我正在更改身份验证以处理仍在开发中的网站上的到期。 (因此现在可以完全控制更改)。 这就是我目前拥有的(伪代码)。 我已经包含了 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()
Q1。 在我实施之前,我想知道我是否遗漏了步骤中的任何明显内容。
Q2。 目前,前端将 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()
我认为您可以在标头中添加 jwt-token 以验证登录用户。
用户登录后,创建有效负载并创建 jwt-token 并将其添加到响应中。
在来自 FE 的后续请求中,您可以添加具有相同令牌的 auth header。
在后端,验证令牌,如果它已过期,请尝试刷新它并再次执行第一步。
有几个在线教程可帮助您创建 jwt-token。 你可以在这里查看。 此外,这篇文章非常适合在 node.js 上设置身份验证。
Q1。 在我实施之前,我想知道我是否遗漏了步骤中的任何明显内容。
其中有不少错误。 您不应该将令牌保存在 DB 上,而是使用 JWT-token 检查到期时间,您也可以使用 node.js 中的会话
Q2。 目前,前端将 userSecret 和 User 令牌存储在本地存储中,服务器发送带有 userToken 和 userSecret(不是 cookie)的 200 响应(参见 /login)。 如果我想将这些数据保存在 FE 上的 cookie 中,上述代码是否应该发送 cookie 或者 FE 可以将响应保存为 cookie 无关紧要?
要让 FE 将这个响应保存在 cookie 中,您需要在后端创建一个。 当您将其附加到响应浏览器时,后续请求将自动附加它。 Go 通过cookies 如何工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.