comunicationLeap/node_modules/connect/lib/middleware/basicAuth.js
node_modules/connect/lib/middleware/basicAuth.jsRaw
1
2/*!
3 * Connect - basicAuth
4 * Copyright(c) 2010 Sencha Inc.
5 * Copyright(c) 2011 TJ Holowaychuk
6 * MIT Licensed
7 */
8
9/**
10 * Module dependencies.
11 */
12
13var utils = require('../utils')
14 , unauthorized = utils.unauthorized;
15
16/**
17 * Basic Auth:
18 *
19 * Enfore basic authentication by providing a `callback(user, pass)`,
20 * which must return `true` in order to gain access. Alternatively an async
21 * method is provided as well, invoking `callback(user, pass, callback)`. Populates
22 * `req.user`. The final alternative is simply passing username / password
23 * strings.
24 *
25 * Simple username and password
26 *
27 * connect(connect.basicAuth('username', 'password'));
28 *
29 * Callback verification
30 *
31 * connect()
32 * .use(connect.basicAuth(function(user, pass){
33 * return 'tj' == user & 'wahoo' == pass;
34 * }))
35 *
36 * Async callback verification, accepting `fn(err, user)`.
37 *
38 * connect()
39 * .use(connect.basicAuth(function(user, pass, fn){
40 * User.authenticate({ user: user, pass: pass }, fn);
41 * }))
42 *
43 * @param {Function|String} callback or username
44 * @param {String} realm
45 * @api public
46 */
47
48module.exports = function basicAuth(callback, realm) {
49 var username, password;
50
51 // user / pass strings
52 if ('string' == typeof callback) {
53 username = callback;
54 password = realm;
55 if ('string' != typeof password) throw new Error('password argument required');
56 realm = arguments[2];
57 callback = function(user, pass){
58 return user == username && pass == password;
59 }
60 }
61
62 realm = realm || 'Authorization Required';
63
64 return function(req, res, next) {
65 var authorization = req.headers.authorization;
66
67 if (req.user) return next();
68 if (!authorization) return unauthorized(res, realm);
69
70 var parts = authorization.split(' ');
71
72 if (parts.length !== 2) return next(utils.error(400));
73
74 var scheme = parts[0]
75 , credentials = new Buffer(parts[1], 'base64').toString()
76 , index = credentials.indexOf(':');
77
78 if ('Basic' != scheme || index < 0) return next(utils.error(400));
79
80 var user = credentials.slice(0, index)
81 , pass = credentials.slice(index + 1);
82
83 // async
84 if (callback.length >= 3) {
85 var pause = utils.pause(req);
86 callback(user, pass, function(err, user){
87 if (err || !user) return unauthorized(res, realm);
88 req.user = req.remoteUser = user;
89 next();
90 pause.resume();
91 });
92 // sync
93 } else {
94 if (callback(user, pass)) {
95 req.user = req.remoteUser = user;
96 next();
97 } else {
98 unauthorized(res, realm);
99 }
100 }
101 }
102};
103