Hapi.js - 添加检查每条路线的机制
Hapi.js - adding mechanism to check every route
我正在尝试实施一种机制,该机制将 运行 在命中任何路由之前。在该机制中,我想从 header 中获取一个值并检查身份验证。
我想到了这个:
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
在路由中我调用它并向它发送 请求 object。请求 object 包含有关 header 的信息。
虽然这有效,但我感觉我没有遵循 Hapi 的最佳实践。
我怎样才能做得更优雅?
有几个选项。
当然,您可以利用 request lifecycle - 注意在路由处理程序之前管道中发生的事件。
尽管如此,我还是建议您考虑实施一种身份验证策略,该策略可以设置为所有路由的默认值或有选择地设置在适当的路由上。
要求对所有或选定路由进行身份验证的最佳方法是使用 hapi 的集成功能。
您应该 set a default authentication strategy 应用于每个路由处理程序。下面的示例使用基本身份验证。您想要为 hapi 创建一个自定义身份验证策略来检查您的 x-authentication
header.
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’s request lifecycle and extend it at given points. Extending the request lifecycle should be done by using plugins:
register: function (server, options, next) {
// do some processing before 'onPreAuth'
// or pick another extension point
server.ext('onPreAuth', (request, reply) => {
// your functionality
})
}
希望对您有所帮助!
我正在尝试实施一种机制,该机制将 运行 在命中任何路由之前。在该机制中,我想从 header 中获取一个值并检查身份验证。
我想到了这个: 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
在路由中我调用它并向它发送 请求 object。请求 object 包含有关 header 的信息。
虽然这有效,但我感觉我没有遵循 Hapi 的最佳实践。
我怎样才能做得更优雅?
有几个选项。
当然,您可以利用 request lifecycle - 注意在路由处理程序之前管道中发生的事件。
尽管如此,我还是建议您考虑实施一种身份验证策略,该策略可以设置为所有路由的默认值或有选择地设置在适当的路由上。
要求对所有或选定路由进行身份验证的最佳方法是使用 hapi 的集成功能。
您应该 set a default authentication strategy 应用于每个路由处理程序。下面的示例使用基本身份验证。您想要为 hapi 创建一个自定义身份验证策略来检查您的 x-authentication
header.
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’s request lifecycle and extend it at given points. Extending the request lifecycle should be done by using plugins:
register: function (server, options, next) {
// do some processing before 'onPreAuth'
// or pick another extension point
server.ext('onPreAuth', (request, reply) => {
// your functionality
})
}
希望对您有所帮助!