/**
* @module user-model
*/
const jwt = require('jwt-simple');
const url = require('url');
// var debug = require( 'debug' )( 'user-model' );
/**
* Returns credentials from request object.
* Handles `'basic'` and `'token'` authentication types.
*
* @static
* @param {module:api-controller~ExpressRequest} req - HTTP request
* @return {object|null} Credentials
*/
function getCredentials(req) {
const auth = req.app.get('linked form and data server').authentication;
const authType = auth.type.toLowerCase();
let creds = null;
if (authType === 'basic') {
const jwToken =
req.signedCookies[req.app.get('authentication cookie name')];
creds = jwToken
? jwt.decode(jwToken, req.app.get('encryption key'))
: null;
} else if (authType === 'token') {
const paramName = auth['query parameter'];
if (!paramName) {
throw new Error(
'Enketo configuration error. No query parameter name configured for token authentication.'
);
}
// Note url.parse is considered a legacy method now, and can be replaced for nodeJS 8+
const referer = req.headers.referer
? url.parse(req.headers.referer, true)
: null;
const tokenValue = referer
? referer.query[paramName]
: req.query[paramName];
if (tokenValue) {
creds = {
bearer: tokenValue,
};
}
}
return creds;
}
module.exports = {
getCredentials,
};