/*! * basic-auth * Copyright(c) 2013 TJ Holowaychuk * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict' /** * Module exports. * @public */ module.exports = auth /** * RegExp for basic auth credentials * * credentials = auth-scheme 1*SP token68 * auth-scheme = "Basic" ; case insensitive * token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"=" * @private */ var credentialsRegExp = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9\-\._~\+\/]+=*) *$/ /** * RegExp for basic auth user/pass * * user-pass = userid ":" password * userid = * * password = *TEXT * @private */ var userPassRegExp = /^([^:]*):(.*)$/ /** * Parse the Authorization header field of a request. * * @param {object} req * @return {object} with .name and .pass * @public */ function auth(req) { if (!req) { throw new TypeError('argument req is required') } if (typeof req !== 'object') { throw new TypeError('argument req is required to be an object') } // get header var header = getAuthorization(req.req || req) // parse header var match = credentialsRegExp.exec(header || '') if (!match) { return } // decode user pass var userPass = userPassRegExp.exec(decodeBase64(match[1])) if (!userPass) { return } // return credentials object return new Credentials(userPass[1], userPass[2]) } /** * Decode base64 string. * @private */ function decodeBase64(str) { return new Buffer(str, 'base64').toString() } /** * Get the Authorization header from request object. * @private */ function getAuthorization(req) { if (!req.headers || typeof req.headers !== 'object') { throw new TypeError('argument req is required to have headers property') } return req.headers.authorization } /** * Object to represent user credentials. * @private */ function Credentials(name, pass) { this.name = name this.pass = pass }