asyncSignatureUrl.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. const urlutil = require('url');
  2. const utility = require('utility');
  3. const copy = require('copy-to');
  4. const signHelper = require('../../common/signUtils');
  5. const { isIP } = require('../utils/isIP');
  6. const { setSTSToken } = require('../utils/setSTSToken');
  7. const { isFunction } = require('../utils/isFunction');
  8. const proto = exports;
  9. proto.asyncSignatureUrl = async function asyncSignatureUrl(name, options) {
  10. if (isIP(this.options.endpoint.hostname)) {
  11. throw new Error('can not get the object URL when endpoint is IP');
  12. }
  13. options = options || {};
  14. name = this._objectName(name);
  15. options.method = options.method || 'GET';
  16. const expires = utility.timestamp() + (options.expires || 1800);
  17. const params = {
  18. bucket: this.options.bucket,
  19. object: name
  20. };
  21. const resource = this._getResource(params);
  22. if (this.options.stsToken && isFunction(this.options.refreshSTSToken)) {
  23. await setSTSToken.call(this);
  24. }
  25. if (this.options.stsToken) {
  26. options['security-token'] = this.options.stsToken;
  27. }
  28. const signRes = signHelper._signatureForURL(this.options.accessKeySecret, options, resource, expires);
  29. const url = urlutil.parse(this._getReqUrl(params));
  30. url.query = {
  31. OSSAccessKeyId: this.options.accessKeyId,
  32. Expires: expires,
  33. Signature: signRes.Signature
  34. };
  35. copy(signRes.subResource).to(url.query);
  36. return url.format();
  37. };