s3-policy-v4
Version:
Amazon AWS S3 Upload Policy Generator with Signature Version 4
142 lines (115 loc) • 5.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
/**
* S3Policy
*/
var CryptoJS = require('crypto-js');
var Buffer = global.Buffer || require('buffer').Buffer;
var assert = function assert(object, message) {
if (object == null) throw new Error(message);
};
var FIVE_MINUTES = 5 * 60 * 1000;
var AWS_ACL = 'public-read';
var AWS_SERVICE_NAME = 's3';
var AWS_REQUEST_POLICY_VERSION = 'aws4_request';
var AWS_ALGORITHM = 'AWS4-HMAC-SHA256';
var DEFAULT_SUCCESS_ACTION_STATUS = '201';
var getDate = function getDate() {
var date = new Date();
var yymmdd = date.toISOString().slice(0, 10).replace(/-/g, '');
var amzDate = yymmdd + 'T000000Z';
return { yymmdd: yymmdd, amzDate: amzDate };
};
/*
* Expires in 5 minutes. Amazon will reject request
* if it arrives after the expiration date.
*
* returns string in ISO8601 GMT format, i.e.
*
* 2016-03-24T20:43:47.314Z
*/
var getExpirationDate = function getExpirationDate() {
return new Date(Date.now() + FIVE_MINUTES).toISOString();
};
var getPolicyParams = function getPolicyParams(options) {
var date = getDate();
var expiration = getExpirationDate();
return {
acl: AWS_ACL,
algorithm: AWS_ALGORITHM,
bucket: options.bucket,
contentType: options.contentType,
credential: options.accessKey + '/' + date.yymmdd + '/' + options.region + '/' + AWS_SERVICE_NAME + '/' + AWS_REQUEST_POLICY_VERSION,
date: date,
expiration: expiration,
key: options.key,
region: options.region,
secretKey: options.secretKey,
successActionStatus: String(options.successActionStatus || DEFAULT_SUCCESS_ACTION_STATUS),
metadata: options.metadata || {}
};
};
var formatPolicyForEncoding = function formatPolicyForEncoding(policy) {
return {
expiration: policy.expiration,
conditions: [{ bucket: policy.bucket }, { key: policy.key }, { acl: policy.acl }, { success_action_status: policy.successActionStatus }, { 'Content-Type': policy.contentType }, { 'x-amz-credential': policy.credential }, { 'x-amz-algorithm': policy.algorithm }, { 'x-amz-date': policy.date.amzDate }].concat(_toConsumableArray(Object.keys(policy.metadata).map(function (k) {
return _defineProperty({}, k, String(policy.metadata[k]));
})))
};
};
var getEncodedPolicy = function getEncodedPolicy(policy) {
return new Buffer(JSON.stringify(policy), 'utf-8').toString('base64');
};
var getSignatureKey = function getSignatureKey(options) {
var kDate = CryptoJS.HmacSHA256(options.date.yymmdd, 'AWS4' + options.secretKey);
var kRegion = CryptoJS.HmacSHA256(options.region, kDate);
var kService = CryptoJS.HmacSHA256(AWS_SERVICE_NAME, kRegion);
var kSigning = CryptoJS.HmacSHA256(AWS_REQUEST_POLICY_VERSION, kService);
return kSigning;
};
var getSignature = function getSignature(base64EncodedPolicy, options) {
return CryptoJS.HmacSHA256(base64EncodedPolicy, getSignatureKey(options)).toString(CryptoJS.enc.Hex);
};
var formatPolicyForRequestBody = function formatPolicyForRequestBody(base64EncodedPolicy, signature, options) {
return {
key: options.key,
acl: options.acl,
success_action_status: options.successActionStatus,
'Content-Type': options.contentType,
'X-Amz-Credential': options.credential,
'X-Amz-Algorithm': options.algorithm,
'X-Amz-Date': options.date.amzDate,
Policy: base64EncodedPolicy,
'X-Amz-Signature': signature
};
};
var S3Policy = exports.S3Policy = function () {
function S3Policy() {
_classCallCheck(this, S3Policy);
}
_createClass(S3Policy, null, [{
key: 'generate',
value: function generate(options) {
assert(options, 'Must provide options');
assert(options.key, 'Must provide `key` option with the object key');
assert(options.bucket, 'Must provide `bucket` option with your AWS bucket name');
assert(options.contentType, 'Must provide `contentType` option with the object content type');
assert(options.region, 'Must provide `region` option with your AWS region');
assert(options.accessKey, 'Must provide `accessKey` option with your AWSAccessKeyId');
assert(options.secretKey, 'Must provide `secretKey` option with your AWSSecretKey');
var policyParams = getPolicyParams(options);
var policy = formatPolicyForEncoding(policyParams);
var base64EncodedPolicy = getEncodedPolicy(policy);
var signature = getSignature(base64EncodedPolicy, policyParams);
return formatPolicyForRequestBody(base64EncodedPolicy, signature, policyParams);
}
}]);
return S3Policy;
}();
exports.default = S3Policy;