3

所以我想检查所有到我的 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();
        }
    }
});
4

2 回答 2

1

我会使用身份验证插件。您可以同时使用多种身份验证策略,不限于一种。这是一个如何做到这一点的例子:

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属性设置为带有策略名称的字符串。当指定多个策略时,参数名称必须是strategies并且应该是一个字符串数组,每个字符串都命名一个要尝试的策略。然后将按顺序尝试这些策略,直到一个成功,或者它们都失败了。

于 2014-08-29T13:37:04.787 回答
0

虽然 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();
  });
});
于 2015-02-20T15:19:19.907 回答