test-digest-auth.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. var assert = require('assert')
  2. , http = require('http')
  3. , request = require('../index')
  4. ;
  5. // Test digest auth
  6. // Using header values captured from interaction with Apache
  7. var numDigestRequests = 0;
  8. var digestServer = http.createServer(function (req, res) {
  9. console.error('Digest auth server: ', req.method, req.url);
  10. numDigestRequests++;
  11. var ok;
  12. if (req.url === '/test/') {
  13. if (req.headers.authorization) {
  14. if (/^Digest username="test", realm="Private", nonce="WpcHS2\/TBAA=dffcc0dbd5f96d49a5477166649b7c0ae3866a93", uri="\/test\/", qop=auth, response="[a-f0-9]{32}", nc=00000001, cnonce="[a-f0-9]{32}", algorithm=MD5, opaque="5ccc069c403ebaf9f0171e9517f40e41"$/.exec(req.headers.authorization)) {
  15. ok = true;
  16. } else {
  17. // Bad auth header, don't send back WWW-Authenticate header
  18. ok = false;
  19. }
  20. } else {
  21. // No auth header, send back WWW-Authenticate header
  22. ok = false;
  23. res.setHeader('www-authenticate', 'Digest realm="Private", nonce="WpcHS2/TBAA=dffcc0dbd5f96d49a5477166649b7c0ae3866a93", algorithm=MD5, qop="auth", opaque="5ccc069c403ebaf9f0171e9517f40e41"');
  24. }
  25. } else if (req.url === '/dir/index.html') {
  26. // RFC2069-compatible mode
  27. // check: http://www.rfc-editor.org/errata_search.php?rfc=2069
  28. if (req.headers.authorization) {
  29. if (/^Digest username="Mufasa", realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="\/dir\/index.html", response="[a-f0-9]{32}", opaque="5ccc069c403ebaf9f0171e9517f40e41"$/.exec(req.headers.authorization)) {
  30. ok = true;
  31. } else {
  32. // Bad auth header, don't send back WWW-Authenticate header
  33. ok = false;
  34. }
  35. } else {
  36. // No auth header, send back WWW-Authenticate header
  37. ok = false;
  38. res.setHeader('www-authenticate', 'Digest realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"');
  39. }
  40. }
  41. if (ok) {
  42. console.log('request ok');
  43. res.end('ok');
  44. } else {
  45. console.log('status=401');
  46. res.statusCode = 401;
  47. res.end('401');
  48. }
  49. });
  50. digestServer.listen(6767);
  51. request({
  52. 'method': 'GET',
  53. 'uri': 'http://localhost:6767/test/',
  54. 'auth': {
  55. 'user': 'test',
  56. 'pass': 'testing',
  57. 'sendImmediately': false
  58. }
  59. }, function(error, response, body) {
  60. assert.equal(response.statusCode, 200);
  61. assert.equal(numDigestRequests, 2);
  62. // If we don't set sendImmediately = false, request will send basic auth
  63. request({
  64. 'method': 'GET',
  65. 'uri': 'http://localhost:6767/test/',
  66. 'auth': {
  67. 'user': 'test',
  68. 'pass': 'testing'
  69. }
  70. }, function(error, response, body) {
  71. assert.equal(response.statusCode, 401);
  72. assert.equal(numDigestRequests, 3);
  73. request({
  74. 'method': 'GET',
  75. 'uri': 'http://localhost:6767/dir/index.html',
  76. 'auth': {
  77. 'user': 'Mufasa',
  78. 'pass': 'CircleOfLife',
  79. 'sendImmediately': false
  80. }
  81. }, function(error, response, body) {
  82. assert.equal(response.statusCode, 200);
  83. assert.equal(numDigestRequests, 5);
  84. console.log('All tests passed');
  85. digestServer.close();
  86. });
  87. });
  88. });