Javascript 我应该创建一个hapijs插件还是使用server.ext在标题中筛选api键

Javascript 我应该创建一个hapijs插件还是使用server.ext在标题中筛选api键,javascript,node.js,hapijs,Javascript,Node.js,Hapijs,因此,我想检查到我的hapi rest api的所有http路由,以获得有效的api密钥。我不想使用身份验证插件,因为除了api令牌检查之外,我还将在某些路由上使用基本身份验证。我习惯于在express中作为中间件来做这件事,但是在hapi中什么是正确的方法呢 我应该创建自己的插件还是使用server.ext来实现这一点。。还是我应该用另一种方式 到目前为止,我就是这样做的 server.ext('onRequest', function (request, next) { //mak

因此,我想检查到我的hapi rest api的所有http路由,以获得有效的api密钥。我不想使用身份验证插件,因为除了api令牌检查之外,我还将在某些路由上使用基本身份验证。我习惯于在express中作为中间件来做这件事,但是在hapi中什么是正确的方法呢

我应该创建自己的插件还是使用server.ext来实现这一点。。还是我应该用另一种方式

到目前为止,我就是这样做的

server.ext('onRequest', function (request, next) {

    //make sure its https
    if(request.headers['x-forwarded-proto'] && request.headers['x-forwarded-proto'] === "http") {
        return next(Boom.badRequest('ssl is required'));
    }
    else
    {
        if (request.headers['x-api-key'] != apiToken) {
            return next(Boom.unauthorized('api key is incorrect'));
        }
        else
        {
            next();
        }
    }
});

我会使用身份验证插件。您可以同时使用多种身份验证策略,但不限于一种。下面是一个如何执行此操作的示例:

var Hapi = require('hapi');
var server = new Hapi.Server(3000);

server.pack.register([require('hapi-auth-basic'), require('hapi-auth-cookie')], function(err) {

  server.auth.strategy('simple', 'basic', { ... });
  server.auth.strategy('session', 'cookie', { ... });

  server.route({
    method: 'GET',
    path: '/',
    auth: {
      strategies: ['simple', 'session']
    },
    handler: function(request, reply) {
      reply('success');
    }
  });

  server.start(function() {
    console.log('Server running at:', server.info.uri);
  });

});
有关更多详细信息,请参阅:

指定一种策略时,可以将
策略
属性设置为 使用策略名称的字符串。当指定多个 strategy,参数名称必须是
Strategys
,并且应该是 字符串数组,每个字符串命名要尝试的策略。这些战略将 然后依次尝试,直到一个成功,或者他们全部成功 失败了


虽然Gergo的响应很好,但我有一个类似的用例,我也需要策略以这样的方式进行操作:

A (Succeed) --> B (Succeed) --> Handler

A (Fail) --> reply(4xx) || A(succeed) --> B (fail) --> reply(4xx)
我是这样处理的

server.ext('onPostAuth', function(request, reply) {
  request.server.auth.test('A', request, function(err) {
    return err ? reply(err) : reply.continue();
  });
});

server.ext('onPostAuth', function(request, reply) {
  request.server.auth.test('B', request, function(err) {
    return err ? reply(err) : reply.continue();
  });
});

我会使用auth插件。您可以同时使用多个身份验证策略。如何设置路由以使用多个身份验证策略,是否将字符串数组传递到auth属性?我试过了,但似乎不起作用。添加了一个示例作为答案。基本上,你需要使用
策略
选项。你能让所有人都成功,而不是只有一个人成功就让它通过吗?例如,api auth key必须始终为true,并且某些路由也需要用户身份验证。我认为只有使用您尝试编写的自定义代码才能实现这一点。理想情况下,你不应该制定两种策略。API令牌应该识别和验证用户,与基本身份验证相同。因此,如果一个战略成功,这就足够了。