Auth0 文档介绍了如何设置 express-jwt
中间件来保护端点。问题在于文档似乎并没有涵盖如何获得有效的 JWT。
在 Angular 方面,有关于使用 Angular 插件实现登录页面的文档,这很好。如何使用 Express 实现一条路由,该路由将接受用户名/密码并向客户端返回适当的 JWT,以便后续请求得到授权?
我想我可能在这里遗漏了关于 JWT 的基本概念;通过 Auth0,当使用用户名-密码-身份验证时,我的猜测是 Auth0 充当这些凭据的存储库。有关于将护照连接到 auth0 和 JWT 的文档,这些文档的问题是该文档假设用户名/密码数据库是本地的某个 MongoDB 实例...我想避免这种类型的设置,这是 auth0 最初的吸引力.
是否有涵盖此内容的示例项目,展示如何在后端获取有效的 JWT,而无需某些单独的前端角度应用程序先请求它?
最佳答案
我使用passport.js内置本地身份验证策略,并将用户信息存储在我在需要授权的路由上读取的 JWT 中。
可以将用户 ID 序列化/反序列化进出 Express session ,以使用请求中的身份验证 token (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,但它在我从事的 Backbone 项目中效果很好,并且此过程应该适用于任何基于浏览器的客户端,可以为每个请求提供 X-auth cookie。您可以使用 ajax 设置来完成此操作:
$(document).ajaxSend(function(event, request) {
var token = readCookie('token');
if (token) {
request.setRequestHeader('authorization', 'Bearer ' + token);
}
});
以下是一个中间件示例,用于验证用户登录并向客户端返回可用于后续请求的 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);
};
关于node.js - 通过 Express/Auth0 后端登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35212263/