Node.js express app.使用中间层进行身份验证

Node.js express app.使用中间层进行身份验证,node.js,authentication,express,redis,Node.js,Authentication,Express,Redis,我正试图从应用程序的中间层获益。使用进行身份验证。我对这一点还不熟悉,我在某个没有例子的地方读到过 我没有使用应用程序。目前使用进行身份验证,但如果有意义,我想使用,我有一个基于令牌的身份验证,根据请求,我执行一些检查,然后将其路由到目标模块 我不想使用任何第三方模块进行身份验证,因为我有自己的令牌生成和验证例程。问题是我如何在以下内容中使用它,因为我使用的身份验证系统是异步过程(我使用redis处理令牌)。我无法从应用程序调用我的异步进程。使用,然后在成功完成后调用下一步,然后再调用失败呢 a

我正试图从
应用程序的中间层获益。使用
进行身份验证。我对这一点还不熟悉,我在某个没有例子的地方读到过

我没有使用<代码>应用程序。目前使用<代码>进行身份验证,但如果有意义,我想使用,我有一个基于令牌的身份验证,根据请求,我执行一些检查,然后将其路由到目标模块

我不想使用任何第三方模块进行身份验证,因为我有自己的令牌生成和验证例程。问题是我如何在以下内容中使用它,因为我使用的身份验证系统是异步过程(我使用redis处理令牌)。我无法从
应用程序调用我的异步进程。使用
,然后在成功完成后调用
下一步
,然后再调用失败呢

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

尽管您说过不想使用第三方模块,但Node/Express身份验证的go-to解决方案是。不要忽视它。这是一个可插拔的认证系统,可以让你使用Facebook、Google、Twitter等不同的提供商(都打包成独立的模块),但你关心的是。这让您可以定义自己的身份验证策略(这似乎是您想要的)。请看一下教程。它使用Passport Local来实现自定义策略。

您已经创建了一个中间件功能,除了有时可能只想“使用”它之外,在这里您几乎拥有了您想要的功能。因此,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...
}
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
});
试着加入一些console.log来看看中间件是如何工作的。你可以这样做:

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...
}
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
});
希望有帮助


Craig

嗨,Alex,实际上我有自己的身份验证系统,我有一个包含电子邮件和密码的用户帐户表,我从数据库中验证它们,生成AuthToken,将它们存储在redis中。下次请求到来时,我将对照redis存储进行检查。Facebook、Google和Twitter的身份验证都不在范围之内。这是一种自定义的身份验证,我想控制我手中的验证和生成。本地身份验证策略完全适用于您拥有自己用户名/密码的情况。但我明白如果你真的想处理所有事情,那就不是正确的解决方案。我想说的另一件事是,您应该阅读代码,了解应该如何做。如果你搞砸了身份验证,我们会在所有的科技博客上看到你;-)我正在研究你的答案,但是,
应用程序有一个奇怪的问题。使用
,它不会在所有路由上调用,这是我第一次使用它,我在app.use函数中放置了一个
控制台
语句,它只在未指定的路由和之后定义的路由上执行,不确定如何正确使用它?实际上,我有一些子模块定义了它们自己的路由等@user2727195订单问题。也就是说,如果您在app.use(…)之前通过app.get(…)捕获路由,那么如果您不在app.get(…)@user2727195中调用next(),它将永远不会运行。将请求处理视为管道,中间件的功能视为管道。您可以按所需的顺序通过任意多个管道运行请求,但一旦发送响应,请求将不再通过任何管道。这将清除<代码>一旦你发送响应,请求将不再通过任何管道。
现在让我把我的设置放在那里,它与典型的设置不同,想想看,几个“核心”,几个模块(我不是指节点模块),我认为核心是正确的词,或者说我在一个应用程序中有几个nodejs应用程序(不是字面意思),其中一个是“管理核心”“外壳核心”实例化核心并将
应用程序分派给所有这些核心,每个核心定义自己的路由(基于路径,/users/routes,如/Admin/routes,/products/routes等),每个核心可以定义自己的
应用程序。使用
,管理核心需要身份验证,因此在其中间层,我会处理这些,我所能想到的就是检查请求的路径是否真的在“/admin”下,否则我会
next()
it,还有其他想法。