Hapi.js – 添加机制来检查每个路由

我试图实现一个机制,将在任何路线被击中之前运行。 在这个机制中,我想从标题中获取一个值并检查身份validation。

我已经拿出这个: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); }); }); 

并在路线。

 '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的最佳做法。

我怎么能更优雅呢?

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

您应该设置应用于每个路由处理程序的默认身份validation策略 。 以下示例使用基本身份validation。 您需要为hapi创build一个自定义身份validation策略来检查您的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 }) } 

希望有所帮助!

有几个选项。

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

尽pipe我强烈build议你考虑实施一个可以设置为所有路由默认的auth策略,或者select适当的路由。