使用 express.js 和 locomotive.js 在中间件中添加 api 令牌



我正在构建一个 rest api 服务器,我将与 angularjs 前端一起使用。 我正在尝试实现一些在每个请求上运行的中间件。 对于每个请求,我想检查 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/),但目前我尝试实现这样的事情的每种方式都会使路由超时。 它将在方法中控制台.log()某些内容,但它的行为就像它在等待它永远不会得到的东西一样。 如果我尝试使用 next(),我会收到一个未定义的错误,并且我不想将应用程序注入身份验证器或任何其他对象。

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();
         }
      } 

我开始构建一个身份验证模块,该模块将包含用于检查和验证 api 令牌的方法。

var Authenticator = function () {
    this.requireApiToken = function() {
        console.log('requireApiToken');
    }
};
module.exports = Authenticator;  

我试图按照他们的 api 参考文档中的表达说去做

app.all(path, [callback...], callback)
app.all('/api/*', requireAuthentication);

我在机车配置/环境/所有内部添加了上面的那行.js

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

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

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

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

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

你的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);

相关内容

  • 没有找到相关文章

最新更新