Я бы порекомендовал json веб-токен aka jwt для этой цели.
Сейчас я пишу REST API в express, mongodb, и я использую jwt для аутентификации. Поскольку я не использую какой-либо каркас внешнего интерфейса или lib, я использую cook ie для хранения токенов jwt.
const jwt = require('jsonwebtoken');
const generateToken = (res, id, auth_level) => {
const token = jwt.sign({id,
auth_level
}, process.env.JWT_KEY, {
expiresIn: '7d'
});
return res.cookie('token', token, {
expires: new Date(Date.now() + 1000 * 60 * 15),
secure: false,
httpOnly: true,
});
};
module.exports = generateToken
В этом примере я вызываю эту функцию при успешной попытке входа в систему. И после этого при каждом доступе к маршруту, используя промежуточное ПО, я пытаюсь определить, есть ли у пользователя этот токен, и попытаться разрешить токен.
const jwt = require('jsonwebtoken');
// Verify user token from cookie
const verifyToken = async (req, res, next) => {
// Get token from cookie named token
const token = req.cookies.token || '';
try {
// Check if cookie exists, maybe expired maybe user didnt have one - no login
if (!token) {
return next();
}
// Decrypt users jwt token and get information
const decrypt = await jwt.verify(token, process.env.JWT_KEY);
// Pass that infomation to request user object
req.user = {
id: decrypt.id,
auth_level: decrypt.auth_level,
test: 'test'
};
// Continue with exectution of app
return next();
} catch (err) {
return res.status(500).json(err.toString());
}
};
module.exports = verifyToken;
Если этот токен действителен, я передаю пользовательский объект в объект req.
После этого я защищаю маршруты с помощью пользовательских промежуточных программ. Код вдохновлен этим учебником , рекомендую его.