2

Auth0 文档描述了如何设置express-jwt中间件来保护端点。问题是文档似乎并没有首先介绍如何获得有效的 JWT。

在角度方面,有关于使用角度插件实现登录页面的文档,这很好。如何使用 express 实现一个路由,该路由将采用用户名/密码并将适当的 JWT 返回给客户端,以便授权后续请求?

我想我可能在这里遗漏了关于 JWT 的基本概念;通过 Auth0,当使用用户名-密码-身份验证时,我的猜测是 Auth0 充当这些凭据的存储库。那里有关于将护照连接到 auth0 和 JWT 的文档,问题在于该文档假定用户名/密码数据库是本地的一些 MongoDB 实例......我想避免这种设置类型,这是 auth0 的初始吸引力.

是否有涵盖此内容的示例项目,展示如何在后端获取有效的 JWT,而无需一些单独的前端 Angular 应用程序首先请求它?

4

2 回答 2

4

我使用本地策略内置的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);

};
于 2016-02-04T22:32:42.493 回答
0

@FrobberOfBits

这是为了回答FrobberOfBits于2016年2月6日3:04发布的后续Q

我使用 auth0 进行本地 + 社交媒体身份验证。auth0 的工作方式是,您将身份验证方法移交给 auth0 ...无论是本地数据库还是社交媒体。这是一种捆绑方法,其中本地数据库和社交媒体身份验证全部捆绑在一起,并由 auth0 作为服务提供给您。

希望这可以帮助。

于 2017-03-07T23:56:05.447 回答