120 lines
2.9 KiB
JavaScript
120 lines
2.9 KiB
JavaScript
var _ = require('lodash'),
|
|
TARGETS = {
|
|
header: 'header',
|
|
query: 'query'
|
|
};
|
|
|
|
/**
|
|
* This module negotiates the following
|
|
*
|
|
* auth: {
|
|
* key: 'string',
|
|
* value: 'string',
|
|
* in: 'string~enum header, query',
|
|
*
|
|
* // @todo implement:
|
|
* privateKey: 'string',
|
|
* privateValue: 'string'
|
|
* }
|
|
* @implements {AuthHandlerInterface}
|
|
*/
|
|
module.exports = {
|
|
/**
|
|
* @property {AuthHandlerInterface~AuthManifest}
|
|
*/
|
|
manifest: {
|
|
info: {
|
|
name: 'apikey',
|
|
version: '0.0.1'
|
|
},
|
|
updates: [
|
|
{
|
|
property: '*',
|
|
type: 'header'
|
|
},
|
|
{
|
|
property: '*',
|
|
type: 'url.param'
|
|
}
|
|
]
|
|
},
|
|
|
|
/**
|
|
* Initializes an item (extracts parameters from intermediate requests if any, etc)
|
|
* before the actual authorization step
|
|
*
|
|
* @param {AuthInterface} auth
|
|
* @param {Response} response
|
|
* @param {AuthHandlerInterface~authInitHookCallback} done
|
|
*/
|
|
init: function (auth, response, done) {
|
|
done();
|
|
},
|
|
|
|
/**
|
|
* Verifies whether the request has required parameters
|
|
*
|
|
* @param {AuthInterface} auth
|
|
* @param {AuthHandlerInterface~authPreHookCallback} done
|
|
*/
|
|
pre: function (auth, done) {
|
|
return done(null, Boolean(auth.get('key') || auth.get('value')));
|
|
},
|
|
|
|
/**
|
|
* Verifies whether the auth succeeded
|
|
*
|
|
* @param {AuthInterface} auth
|
|
* @param {Response} response
|
|
* @param {AuthHandlerInterface~authPostHookCallback} done
|
|
*/
|
|
post: function (auth, response, done) {
|
|
done(null, true);
|
|
},
|
|
|
|
/**
|
|
* Signs the request
|
|
*
|
|
* @param {AuthInterface} auth
|
|
* @param {Request} request
|
|
* @param {AuthHandlerInterface~authSignHookCallback} done
|
|
*/
|
|
sign: function (auth, request, done) {
|
|
var target = TARGETS[auth.get('in')] || TARGETS.header,
|
|
key = auth.get('key'),
|
|
value = auth.get('value'),
|
|
|
|
lkey = _.lowerCase(key); // needed for header case insensitive matches
|
|
|
|
// either key or value should be present
|
|
if (!(key || value)) {
|
|
return done();
|
|
}
|
|
|
|
if (target === TARGETS.header) {
|
|
request.headers.remove(function (header) {
|
|
return header && (_.lowerCase(header.key) === lkey);
|
|
});
|
|
|
|
request.headers.add({
|
|
key: key,
|
|
value: value,
|
|
system: true
|
|
});
|
|
}
|
|
else if (target === TARGETS.query) {
|
|
request.url.query.remove(function (query) {
|
|
return query && (query.key === key);
|
|
});
|
|
|
|
request.url.query.add({
|
|
key: key,
|
|
value: value,
|
|
system: true
|
|
});
|
|
}
|
|
|
|
return done();
|
|
}
|
|
};
|