3

我正在构建一个将与 angularjs 前端一起使用的 rest api 服务器。我正在尝试实现一些在每个请求上运行的中间件。对于每个请求,我想检查一个 api 令牌是否存在继续检查是否有效,如果不存在则返回未经授权的响应而不完成请求。

这些请求在我尝试添加中间件之前起作用,但是一旦我尝试添加中间件或在主路由超时之前捕获路由,它就会超时。

http://localhost:3000/developer/test?api=fhgjtyd6fjrj4off6r4rhgjdldksrghiue750f
{
    response: {
        id: "test",
        api: "fhgjtyd6fjrj4off6r4rhgjdldksrghiue750f"
    }
}

这两条路线都可以,但我更喜欢资源版本。(http://locomotivejs.org/guide/routing/

this.match('/developer', { controller: 'developer', action: 'show' });

this.resources('developer');

这是我一直试图遵循的一个例子,因为它看起来主要是我需要做的。(http://webapplog.com/intro-to-express-js-parameters-error-handling-and-other-middleware/),但目前我尝试实现这样的每一种方式都会超时路由。它将 console.log() 方法中的某些内容,但它的行为就像它正在等待它永远不会得到的东西。如果我尝试使用 next() ,我会收到一个未定义的错误,并且我不想将应用程序注入到 Authenticator 或任何其他对象中。

function requiredParamHandler(param){
    //do something with a param, e.g., check that it's present in a query string
    return function (req,res, next) {
    //use param, e.g., if token is valid proceed with next();
        next();
    });
 }

 app.get('/api/v1/stories/:id', requiredParamHandler('token'), story.show);

     var story  = {
         show: function (req, res, next) {
             //do some logic, e.g., restrict fields to output
             return res.send();
         }
      } 

我开始构建一个 Auth 模块,其中包含检查和验证 api 令牌的方法。

var Authenticator = function () {

    this.requireApiToken = function() {
        console.log('requireApiToken');

    }

};

module.exports = Authenticator;  

我试图按照他们在他们的 api 参考文档中所说的做

app.all(path, [callback...], callback)

app.all('/api/*', requireAuthentication);

我在 locomotives config/environments/all.js 上面添加了那行

auth = new Authenticator();
this.express.all('*', auth.requireApiToken);

但这是路由开始超时的时候,我什至没有收到错误或任何东西;

我也尝试使用常规路由方法,但它做同样的事情。

this.match('/developer/:id', auth.requireApiToken, { controller: 'developer', action: 'show' });

我想捕获所有到达服务器的路由并检查查询字符串中是否存在 api 令牌。如果不存在,则发回未经授权的响应,如果存在则进行检查,如果一切正常,则继续路由到正确的路由/控制器。您如何使用机车完成此任务并防止路线超时?

4

1 回答 1

6

requireApiToken应该充当适当的中间件,但事实并非如此(它只是console.log一些东西)。

使用中间件,您需要发回响应,或者使用以下next函数继续运行中间件链:

var Authenticator = function () {

  this.requireApiToken = function(req, res, next) {
    console.log('requireApiToken');
    next();
  };

};

module.exports = Authenticator;

此外,机车从 Express 复制了一些功能,因此您可以直接使用它们,而不必使用它们this.express来使它们工作。所以这也应该工作(在config/environment/*.js):

var auth = new Authenticator;
this.use(auth.requestApiToken);
于 2013-11-05T20:14:26.330 回答