繁体   English   中英

Hapi.js - 添加机制来检查每条路线

[英]Hapi.js - adding mechanism to check every route

我正在尝试实现一种机制,该机制将在命中任何路由之前运行。 在该机制中,我想从标头中获取一个值并检查身份验证。

我想出了这个:server.js:

// Create a server with a host and port
'use strict';

var Hapi = require('hapi');
var mongojs = require('mongojs');

var plugins = [      
  require('./routes/entities')
];
var server = new Hapi.Server();
server.connection({
   port: 3000
});
//Connect to db
server.app.db = mongojs('hapi-rest-mongo', ['entities']);

server.app.checkHeader = function (request) {
var header = request.headers['x-authorization'];
if(header === "letmein"){
    return true
}
return false
};
  //Load plugins and start server
server.register(plugins, function (err) {

if (err) {
    throw err;
}

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

并在 routes.entities 中:

'use strict';

var Boom = require('boom');
var uuid = require('node-uuid');
var Joi = require('joi');

exports.register = function (server, options, next) {

var db = server.app.db;

server.route({
    method: 'GET',
    path: '/entities',
    handler: function handler(request, reply) {

        if(!server.app.checkHeader(request))
        {
            return reply(Boom.unauthorized());

        };

         //request.server.myFunc();
        db.entities.find(function (err, docs) {

            if (err) {
                return reply(Boom.wrap(err, 'Internal MongoDB error'));
            }

            reply(docs);
        });
    }
});

所以简而言之,在启动服务器时我已经注册了我的函数server.app.checkHeader

在路由中,我调用它并向它发送一个请求对象。 请求对象包含有关标头的信息。

虽然这有效,但我感觉我没有遵循 Hapi 的最佳实践。

我怎样才能做得更优雅?

有几个选项。

当然,您可以进入请求生命周期——注意在路由处理程序之前在管道中发生的事件。

尽管如此,我还是建议您考虑实施一种身份验证策略,该策略可以设置为所有路由的默认设置,也可以选择性地设置在适当的路由上。

要求对所有或选定路由进行身份验证的最佳方法是使用 hapi 的集成功能。

您应该设置应用于每个路由处理程序的默认身份验证策略 下面的示例使用基本身份验证。 您想为 hapi 创建自定义身份验证策略以检查您的x-authentication标头。

const Hapi = require('hapi')  
const BasicAuth = require('hapi-auth-basic')
const server = new Hapi.Server()

server.register(BasicAuth, function (err) {  
  if (err) {
    console.log('error', 'failed to install plugins')
    throw err
  }

  // TODO: add authentication strategy & set as default
  server.auth.strategy('simple', 'basic', true, { validateFunc: basicValidationFn })  

  // or set strategy separately as default auth strategy
  server.auth.strategy('simple', 'basic', { validateFunc: basicValidationFn })  
  server.auth.default('simple')  


  // TODO: add routes

  server.start(function (err) {
  })
})

您还可以注入hapi 的请求生命周期并在给定点扩展它 应该使用插件来扩展请求生命周期:

register: function (server, options, next) {
  // do some processing before 'onPreAuth'
  // or pick another extension point
  server.ext('onPreAuth', (request, reply) => {
    // your functionality
  })
}

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM