22 * morgan
33 * Copyright(c) 2013 TJ Holowaychuk
44 * Copyright(c) 2014 Jonathan Ong
5+ * Copyright(c) 2015 Douglas Christopher Wilson
56 * MIT Licensed
67 */
78
1213
1314module . exports = auth
1415
16+ /**
17+ * RegExp for basic auth credentials
18+ *
19+ * credentials = auth-scheme 1*SP token68
20+ * auth-scheme = "Basic" ; case insensitive
21+ * token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"="
22+ * @private
23+ */
24+
25+ var credentialsRegExp = / ^ * (?: [ B b ] [ A a ] [ S s ] [ I i ] [ C c ] ) + ( [ A - Z a - z 0 - 9 \- \. _ ~ \+ \/ ] + = * ) * $ /
26+
1527/**
1628 * RegExp for basic auth user/pass
29+ *
30+ * user-pass = userid ":" password
31+ * userid = *<TEXT excluding ":">
32+ * password = *TEXT
33+ * @private
1734 */
1835
1936var userPassRegExp = / ^ ( [ ^ : ] * ) : ( .* ) $ /
@@ -29,19 +46,40 @@ var userPassRegExp = /^([^:]*):(.*)$/
2946function auth ( req ) {
3047 req = req . req || req ;
3148
32- var auth = req . headers . authorization ;
33- if ( ! auth ) return ;
49+ // parse header
50+ var header = req . headers . authorization
51+ var match = credentialsRegExp . exec ( header || '' )
52+
53+ if ( ! match ) {
54+ return
55+ }
3456
35- // malformed
36- var parts = auth . split ( ' ' ) ;
37- if ( 'basic' != parts [ 0 ] . toLowerCase ( ) ) return ;
38- if ( ! parts [ 1 ] ) return ;
39- auth = parts [ 1 ] ;
57+ // decode user pass
58+ var userPass = userPassRegExp . exec ( decodeBase64 ( match [ 1 ] ) )
4059
41- // credentials
42- auth = new Buffer ( auth , 'base64' ) . toString ( ) ;
43- auth = auth . match ( userPassRegExp )
44- if ( ! auth ) return ;
60+ if ( ! userPass ) {
61+ return
62+ }
63+
64+ // return credentials object
65+ return new Credentials ( userPass [ 1 ] , userPass [ 2 ] )
66+ }
67+
68+ /**
69+ * Decode base64 string.
70+ * @private
71+ */
72+
73+ function decodeBase64 ( str ) {
74+ return new Buffer ( str , 'base64' ) . toString ( )
75+ }
76+
77+ /**
78+ * Object to represent user credentials.
79+ * @private
80+ */
4581
46- return { name : auth [ 1 ] , pass : auth [ 2 ] } ;
82+ function Credentials ( name , pass ) {
83+ this . name = name
84+ this . pass = pass
4785}
0 commit comments