v3.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var AWS = require('../core');
  2. var inherit = AWS.util.inherit;
  3. /**
  4. * @api private
  5. */
  6. AWS.Signers.V3 = inherit(AWS.Signers.RequestSigner, {
  7. addAuthorization: function addAuthorization(credentials, date) {
  8. var datetime = AWS.util.date.rfc822(date);
  9. this.request.headers['X-Amz-Date'] = datetime;
  10. if (credentials.sessionToken) {
  11. this.request.headers['x-amz-security-token'] = credentials.sessionToken;
  12. }
  13. this.request.headers['X-Amzn-Authorization'] =
  14. this.authorization(credentials, datetime);
  15. },
  16. authorization: function authorization(credentials) {
  17. return 'AWS3 ' +
  18. 'AWSAccessKeyId=' + credentials.accessKeyId + ',' +
  19. 'Algorithm=HmacSHA256,' +
  20. 'SignedHeaders=' + this.signedHeaders() + ',' +
  21. 'Signature=' + this.signature(credentials);
  22. },
  23. signedHeaders: function signedHeaders() {
  24. var headers = [];
  25. AWS.util.arrayEach(this.headersToSign(), function iterator(h) {
  26. headers.push(h.toLowerCase());
  27. });
  28. return headers.sort().join(';');
  29. },
  30. canonicalHeaders: function canonicalHeaders() {
  31. var headers = this.request.headers;
  32. var parts = [];
  33. AWS.util.arrayEach(this.headersToSign(), function iterator(h) {
  34. parts.push(h.toLowerCase().trim() + ':' + String(headers[h]).trim());
  35. });
  36. return parts.sort().join('\n') + '\n';
  37. },
  38. headersToSign: function headersToSign() {
  39. var headers = [];
  40. AWS.util.each(this.request.headers, function iterator(k) {
  41. if (k === 'Host' || k === 'Content-Encoding' || k.match(/^X-Amz/i)) {
  42. headers.push(k);
  43. }
  44. });
  45. return headers;
  46. },
  47. signature: function signature(credentials) {
  48. return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64');
  49. },
  50. stringToSign: function stringToSign() {
  51. var parts = [];
  52. parts.push(this.request.method);
  53. parts.push('/');
  54. parts.push('');
  55. parts.push(this.canonicalHeaders());
  56. parts.push(this.request.body);
  57. return AWS.util.crypto.sha256(parts.join('\n'));
  58. }
  59. });
  60. /**
  61. * @api private
  62. */
  63. module.exports = AWS.Signers.V3;