我使用本地策略内置的passport.js进行身份验证,并将用户信息存储在我在需要授权的路由上读取的 JWT 中。
用户 ID 可以序列化/反序列化进入和退出快速会话,以使用请求中的身份验证令牌 (JWT) 获取用户标识符。在我看来,这是最好的方法,因为它限制了存储在客户端上的数据量,并且比存储任何用户信息提供了更好的安全性。这是 express 中的一个示例:
//Set a session secret
var secrets = { sessionSecret: process.env.secret || 'my secret string'};
//Require express-jwt and set a secret for the cookie
var expressJwt = require('express-jwt');
var validateJwt = expressJwt({ secret: secrets.sessionSecret });
//Returns a jwt token signed by the app secret
var signToken = function(id) {
return jwt.sign({
id: id
}, secrets.sessionSecret, {
expiresInMinutes: 60 * 24 // 24 hours
});
};
//Set token cookie directly
var setTokenCookie = function(req, res) {
if (!req.user) {
return res.status(404).json({
message: 'Error during user validation'
});
}
var token = signToken(req.user.id, req.user.role);
res.cookie('token', JSON.stringify(token));
};
//Check to see if user is authenticated (call this when a route is requested)
var isAuthenticated = function(req, res, next) {
// allow access_token to be passed through query parameter as well
if (req.body && req.body.hasOwnProperty('access_token')) {
req.headers.authorization = 'Bearer ' + req.body.access_token;
}
// Validate jwt token
return validateJwt(req, res, next);
};
您可以将这些方法用作 express 中的中间件。假设上面的代码是 token.js,你可以强制它在每个请求上执行,如下所示:
app.get('/employee', token.isAuthenticated, employeeController.getEmployees);
我没有使用过 Angular,但它在我从事的骨干项目上效果很好,而且这个过程应该适用于任何可以在每个请求上提供 X-auth cookie 的基于浏览器的客户端。您可以通过使用 ajax 设置来做到这一点:
$(document).ajaxSend(function(event, request) {
var token = readCookie('token');
if (token) {
request.setRequestHeader('authorization', 'Bearer ' + token);
}
});
下面是一个中间件示例,它验证用户登录并将令牌返回给客户端,该令牌可用于后续请求:
var validateLogin = function (req, res, next) {
var username = req.params.username;
// Authenticate using local strategy
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(404).json({
info: [{
msg: info.message
}]
});
}
// Send user and authentication token
var token = token.signToken(user.id, user.role);
res.cookie('token', token);
res.render('index', {token: token, user: user});
})(req, res, next);
};