你想怎么做是对的。这里有更多解释:
您所说的称为授权(与身份验证不同),它处理用户可以访问或不可以访问的内容。您可以通过多种方式验证授权。
使用会话 cookie 是一种方法。
但是......由于您正在构建 API,因此将前端和后端“分离”(有人说“不可知”)是一个好习惯,这意味着前端不应该知道任何关于后端的信息,反之亦然。这使得使用会话 cookie 并不理想(因为您在前端有 cookie,而有关会话的信息存储在后端)。
因此,使用令牌 (JWT) 是处理授权的好方法。
在您的情况下,您确实可以先对用户进行身份验证,然后将令牌存储在前端。
然后,您可以像这样处理授权:
前端:在标头中发送带有所有请求的令牌(如果存在)。
后端:验证令牌。如果有效,让用户通过。如果没有,请向前端发送错误消息!
如果前端收到错误消息,请重定向到登录(或您想要的任何地方)。
你是怎么做到的? (我将专注于后端。前端没有什么特别的)。
在您的主应用文件(通常是 app.js)中:
const express = require('express')
const publicRoutes = require('./routes/publicroutes')
const privateRoutes = require('./routes/privateroutes')
const defineAuth = require('./helpers/defineauth')
const isAuth = require('./helpers/isAuth')
const app = express()
app.use(defineAuth)
app.use('/publicRoute', publicRoutes) // like /login, /signup, etc...
app.use(isAuth)
app.use('/privateRoute', privateRoutes) // accessible only with a valid token
在defineAuth中间件中:
验证是否有授权头
-
验证令牌
defineauth 中间件:
const jwt = require('jsonwebtoken')
module.exports = (req, res, next) => {
const authHeader = req.get('Authorization')
if (!authHeader) {
req.isAuth = false
return next()
}
const token = authHeader.split(' ')[1]
let decodedToken
try {
decodedToken = jwt.verify(token, process.env.JWT_KEY)
} catch (err) {
req.isAuth = false
return next()
}
if (!decodedToken) {
req.isAuth = false
return next()
}
// Here, the token is valid so :
req.isAuth = true
next()
}
然后,您可以轻松地检查代码中的任何位置,如果用户被授权或未授权。在这里我签入 app.js。
isAuth middleware :
const isAuth = (req, res, next) => {
if (!req.isAuth) {
const error = new Error('Authorization required')
error.status = 401
throw error
}
next()
}
module.exports = isAuth
您可以在任何地方验证授权。这样一来,处理不同级别的授权变得更加容易(例如,如果您有免费和高级用户)。