-
Notifications
You must be signed in to change notification settings - Fork 35
/
basic-auth.js
67 lines (57 loc) · 1.85 KB
/
basic-auth.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var strata = require('./index');
var utils = require('./utils');
/**
* A middleware that performs basic auth on the incoming request before passing
* it downstream. The validate argument must be a function that accepts three
* arguments: the username and password used in the request, and a callback to
* to call when auth is complete. This callback should be called with two
* arguments: any error that occured and a string that contains the name of the
* authorized user, if any.
*
* strata.basicAuth(app, function (user, pass, callback) {
* if (user === 'admin' && pass === 'secret') {
* callback(null, user);
* } else {
* callback(null, false);
* }
* });
*
* When authorization fails, the client will automatically receive a 401
* Unauthorized response with the appropriate challenge in the WWW-Authenticate
* header.
*/
module.exports = function (app, validate, realm) {
if (typeof validate !== 'function') {
throw new strata.Error('Missing validation function for basic auth');
}
function basicAuth(env, callback) {
if (env.remoteUser) {
app(env, callback);
return;
}
var authorization = env.headers['authorization'];
if (!authorization) {
utils.unauthorized(env, callback, realm);
return;
}
var parts = authorization.split(' ');
var scheme = parts[0];
if (scheme.toLowerCase() !== 'basic') {
utils.badRequest(env, callback);
return;
}
var params = new Buffer(parts[1], 'base64').toString().split(':');
validate(params[0], params[1], function (err, user) {
if (err && strata.handleError(err, env, callback)) {
return;
}
if (user) {
env.remoteUser = user;
app(env, callback);
} else {
utils.unauthorized(env, callback, realm);
}
});
}
return basicAuth;
};