表达app.use中间层以进行身份​​验证

时间:2015-05-17 01:32:48

标签: node.js authentication express redis

我试图从app.use的中间层获益以进行身份​​验证。我是新手,我在没有示例的情况下阅读了它。

我目前没有使用app.use进行身份验证,但如果有意义的话我想使用,我已经根据请求进行了基于令牌的身份验证,执行一些检查,然后将其路由到目标模块。

我不想使用任何第三方模块进行身份验证,因为我自己的令牌生成和验证例程。问题是如何在以下内容中使用它,因为身份验证系统我是异步程序(我已经处理了令牌)。我无法从app.use调用我的异步过程,然后在成功完成后调用next,然后失败怎么办?

app.use(function(request, response, next){
    next();
});

2 个答案:

答案 0 :(得分:2)

你几乎拥有你想要的东西,因为你已经创建了一个中间件功能,除非你有时只想“使用”它。因此,app.use仅适用于您希望在每次访问服务器的请求上使用令牌解析。你可能有一些你想要一个令牌的路线和其他可以公开给任何人的路线,无论是否登录。

您可能缺少的部分是您可以为该功能指定名称并将其应用于某些路线,而不是其他路线。您可以通过命名中间件功能来完成此操作。

var tokenMiddlewareFn = function(req, res, next) {
    // do stuff
    next();
}

然后当你想申请时:

app.get('/protected', tokenMiddlewareFn, function(req, res, next) {
   // do stuff
}

我通常将所有中间件功能放在一个目录中,每个都作为自己的文件。除了检查身份验证令牌之外,我发现有用的中间件函数示例是解析分页查询字符串参数,因为许多路由将使用想要以相同方式解析对这些参数的请求。遵循该样式进行身份验证,您可以在中间件目录中放置一个文件,比如require-auth.js,如下所示:

module.exports = function (req, res, next) {

    var token = req.header('X-App-Auth');

    // do what you want with token...perhaps attaching some data to the 
    // request after you perform the redis lookup
    req.userId = what you find in redis

    next();
}

然后,当将请求路由到受保护的地方并想要一个令牌时,您可以执行以下操作:

var requireAuth = require('path/to/middleware/require-auth');

app.get('/protected', requireAuth, function(req, res, next) {
    // require auth was run before getting here and
    // you now can access req.userId
});

app.get('/unprotected', function(req, res, next) {
   // requireAuth was never run...
}

尝试投入一些console.log来亲自了解中间件的工作原理。你可以这样做:

var a = function(req, res, next) { 
    console.log("...executing a");
    next();
}

var b = function(req, res, next) { 
    console.log("...executing b"); 
    next();
}

var c = function(req, res, next) { 
    console.log("...executing c"); 
    next();
}

app.use(c);

app.get('/', a, b, function(req, res, next) {
    // a, b, and c were already executed in the order of c a b
});

app.get('/test', function(req, res, next) {
    // just c was run
});

希望有所帮助,

克雷格

答案 1 :(得分:0)

即使您说您不想使用第三方模块,但Node / Express身份验证的首选解决方案是Passport。不要解雇它。它是一个可插拔的身份验证系统,可以让你使用一堆不同的提供商,如Facebook,谷歌,Twitter等(所有包装为独立模块),但你关心的是Passport Local。这使您可以定义自己的身份验证策略(这似乎是您想要的)。看一下教程Authenticating Node.js Applications With Passport。它使用Passport Local来实现自定义策略。