租房小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.2 KiB

3 months ago
  1. const dateFormat = require('dateformat');
  2. const urlUtil = require('url');
  3. const signHelper = require('../../common/signUtils');
  4. const { setSTSToken } = require('../utils/setSTSToken');
  5. const { isFunction } = require('../utils/isFunction');
  6. const { getStandardRegion } = require('../utils/getStandardRegion');
  7. const proto = exports;
  8. /**
  9. * signatureUrlV4
  10. *
  11. * @param {string} method
  12. * @param {number} expires
  13. * @param {Object} [request]
  14. * @param {Object} [request.headers]
  15. * @param {Object} [request.queries]
  16. * @param {string} [objectName]
  17. * @param {string[]} [additionalHeaders]
  18. */
  19. proto.signatureUrlV4 = async function signatureUrlV4(method, expires, request, objectName, additionalHeaders) {
  20. const headers = (request && request.headers) || {};
  21. const queries = { ...((request && request.queries) || {}) };
  22. const date = new Date();
  23. const formattedDate = dateFormat(date, "UTC:yyyymmdd'T'HHMMss'Z'");
  24. const onlyDate = formattedDate.split('T')[0];
  25. const fixedAdditionalHeaders = signHelper.fixAdditionalHeaders(additionalHeaders);
  26. const region = getStandardRegion(this.options.region);
  27. if (fixedAdditionalHeaders.length > 0) {
  28. queries['x-oss-additional-headers'] = fixedAdditionalHeaders.join(';');
  29. }
  30. queries['x-oss-credential'] = `${this.options.accessKeyId}/${onlyDate}/${region}/oss/aliyun_v4_request`;
  31. queries['x-oss-date'] = formattedDate;
  32. queries['x-oss-expires'] = expires;
  33. queries['x-oss-signature-version'] = 'OSS4-HMAC-SHA256';
  34. if (this.options.stsToken && isFunction(this.options.refreshSTSToken)) {
  35. await setSTSToken.call(this);
  36. }
  37. if (this.options.stsToken) {
  38. queries['x-oss-security-token'] = this.options.stsToken;
  39. }
  40. const canonicalRequest = signHelper.getCanonicalRequest(
  41. method,
  42. {
  43. headers,
  44. queries
  45. },
  46. this.options.bucket,
  47. objectName,
  48. fixedAdditionalHeaders
  49. );
  50. const stringToSign = signHelper.getStringToSign(region, formattedDate, canonicalRequest);
  51. queries['x-oss-signature'] = signHelper.getSignatureV4(this.options.accessKeySecret, onlyDate, region, stringToSign);
  52. const signedUrl = urlUtil.parse(
  53. this._getReqUrl({
  54. bucket: this.options.bucket,
  55. object: objectName
  56. })
  57. );
  58. signedUrl.query = { ...queries };
  59. return signedUrl.format();
  60. };