Вы правы в том, как вы хотите это сделать. Вот еще одно объяснение:
То, о чем вы говорите, называется авторизацией (и отличается от аутентификации), которая обрабатывает то, что пользователь может получить доступ или нет. Вы можете проверить авторизацию различными способами.
Использование сеанса повара ie - это один из способов. Но ... поскольку вы создаете API, хорошей практикой является разделение внешнего интерфейса и внутреннего интерфейса (некоторые говорят "agnosti c"), что означает, что внешний интерфейс не должен ничего знать о внутреннем интерфейсе, и наоборот. -versa. Это делает использование сеанса cook ie не идеальным (поскольку у вас есть cook ie во внешнем интерфейсе, а информация о сеансе хранится в бэкэнде).
Таким образом, использование токена (JWT) хороший способ обработки авторизации.
В вашем случае вы действительно можете сначала аутентифицировать пользователя, а затем сохранить токен во внешнем интерфейсе.
Затем вы можете обрабатывать авторизацию следующим образом:
Внешний интерфейс: отправьте маркер со всеми запросами, если он существует, в заголовке.
Бэкэнд: проверьте токен. Если он действителен, пропустите пользователя. Если нет, отправьте сообщение об ошибке в веб-интерфейс!
Если веб-интерфейс возвращает сообщение об ошибке, перенаправьте его в систему (или куда хотите).
Как ты это делаешь? (Я остановлюсь на бэкэнде. Там нет ничего, определяющего c во внешнем интерфейсе).
В вашем основном файле приложения (обычно 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()
}
Тогда вы можете легко проверить в любом месте вашего кода, авторизован пользователь или нет. Здесь я проверяю приложение. 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
Вы можете подтвердить авторизацию где угодно. Таким образом, значительно упрощается работа с различными уровнями авторизации (если у вас есть, например, бесплатные и премиум-пользователи).