Hapi认证方案:设置自定义header
Hapi authentication scheme: Set custom header
我正在 Hapi.js 中实施身份验证方案。
在我的 authenticate
函数中,我验证请求并想要设置自定义 header。但是由于我必须使用 reply.continue()
完成身份验证功能,所以我无法将任何 header 传递给响应。
如何将我的自定义 header 传递给客户?
最小代码:
var Boom = require('boom'),
Hoek = require('hoek'),
request = require('request');
exports.register = function(plugin, config, next) {
plugin.auth.scheme('myScheme', function(server, options) {
Hoek.assert(options, 'Missing auth strategy options');
return {
authenticate: function(req, reply) {
request(
'http://localhost/somewhere',
function(error, response, body) {
if (error) {
return reply(null, null, Boom.unauthorized(null, 'myScheme'));
}
options.validateFunc(
body,
function(validateError, isValid, credentials) {
if (validateError || !isValid) {
return reply(
Boom.unauthorized('Invalid cookie'),
null,
{credentials: credentials}
);
}
// I want to add a custom header here
//.header('my-header', 'my-header-content')
return reply
.continue({
credentials: credentials || body
}));
}
);
}
);
}
};
});
next();
};
exports.register.attributes = {
pkg: require('../package.json')
};
解决方案是在插件数据中保存 header 并添加一个 response
函数,该函数在身份验证后调用,可用于将 header 添加到响应。
更新后的代码:
var Boom = require('boom'),
Hoek = require('hoek'),
request = require('request');
exports.register = function(plugin, config, next) {
plugin.auth.scheme('myScheme', function(server, options) {
Hoek.assert(options, 'Missing auth strategy options');
return {
// add headers to the response.
response: function(request, reply) {
var pluginData = request.plugins['myScheme'];
if (pluginData && pluginData['my-header']) {
request.response.header('my-header', pluginData['my-header']);
}
reply.continue();
},
authenticate: function(req, reply) {
request(
'http://localhost/somewhere',
function(error, response, body) {
if (error) {
return reply(null, null, Boom.unauthorized(null, 'myScheme'));
}
options.validateFunc(
body,
function(validateError, isValid, credentials) {
if (validateError || !isValid) {
return reply(
Boom.unauthorized('Invalid cookie'),
null,
{credentials: credentials}
);
}
// save header in the plugin data
request.plugins['myScheme'] = {
'my-header': 'my-header-content'
};
return reply
.continue({
credentials: credentials || body
}));
}
);
}
);
}
};
});
next();
};
exports.register.attributes = {
pkg: require('../package.json')
};
我正在 Hapi.js 中实施身份验证方案。
在我的 authenticate
函数中,我验证请求并想要设置自定义 header。但是由于我必须使用 reply.continue()
完成身份验证功能,所以我无法将任何 header 传递给响应。
如何将我的自定义 header 传递给客户?
最小代码:
var Boom = require('boom'),
Hoek = require('hoek'),
request = require('request');
exports.register = function(plugin, config, next) {
plugin.auth.scheme('myScheme', function(server, options) {
Hoek.assert(options, 'Missing auth strategy options');
return {
authenticate: function(req, reply) {
request(
'http://localhost/somewhere',
function(error, response, body) {
if (error) {
return reply(null, null, Boom.unauthorized(null, 'myScheme'));
}
options.validateFunc(
body,
function(validateError, isValid, credentials) {
if (validateError || !isValid) {
return reply(
Boom.unauthorized('Invalid cookie'),
null,
{credentials: credentials}
);
}
// I want to add a custom header here
//.header('my-header', 'my-header-content')
return reply
.continue({
credentials: credentials || body
}));
}
);
}
);
}
};
});
next();
};
exports.register.attributes = {
pkg: require('../package.json')
};
解决方案是在插件数据中保存 header 并添加一个 response
函数,该函数在身份验证后调用,可用于将 header 添加到响应。
更新后的代码:
var Boom = require('boom'),
Hoek = require('hoek'),
request = require('request');
exports.register = function(plugin, config, next) {
plugin.auth.scheme('myScheme', function(server, options) {
Hoek.assert(options, 'Missing auth strategy options');
return {
// add headers to the response.
response: function(request, reply) {
var pluginData = request.plugins['myScheme'];
if (pluginData && pluginData['my-header']) {
request.response.header('my-header', pluginData['my-header']);
}
reply.continue();
},
authenticate: function(req, reply) {
request(
'http://localhost/somewhere',
function(error, response, body) {
if (error) {
return reply(null, null, Boom.unauthorized(null, 'myScheme'));
}
options.validateFunc(
body,
function(validateError, isValid, credentials) {
if (validateError || !isValid) {
return reply(
Boom.unauthorized('Invalid cookie'),
null,
{credentials: credentials}
);
}
// save header in the plugin data
request.plugins['myScheme'] = {
'my-header': 'my-header-content'
};
return reply
.continue({
credentials: credentials || body
}));
}
);
}
);
}
};
});
next();
};
exports.register.attributes = {
pkg: require('../package.json')
};