node.js - 通过 Express/Auth0 后端登录用户

标签 node.js express jwt auth0

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/

相关文章:

javascript - 编译Coffeescript时不要添加var

node.js - Node - 将 google openid 保存到 mongodb

node.js - 如何使用 Express 设置我的 sitemap.xml 的 'X-Robots-Tag'

node.js - 测试 Mongo 的数据生成器?

javascript - JWT 子声明在验证期间被忽略

javascript - 没有过载匹配此调用。最后一个重载给出了以下错误。输入 '"文本 "' is not assignable to type ' “json”'

javascript - 如何理解对象中的第一个元素是否有效?

javascript - 从 Moment.js 对象获取小时、分钟、秒

javascript - MERN 和 Redux : How do you pass Redux state data from Index to Show page?

asp.net-web-api - 无法加载文件或程序集“Microsoft.IdentityModel.Tokens,版本=5.2.0.0