oss-client
Version:
Aliyun OSS(Object Storage Service) Node.js Client
145 lines • 12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildCanonicalString = buildCanonicalString;
exports.computeSignature = computeSignature;
exports.authorization = authorization;
exports.signatureForURL = signatureForURL;
const node_util_1 = require("node:util");
const node_crypto_1 = __importDefault(require("node:crypto"));
const encodeCallback_js_1 = require("./encodeCallback.js");
const debug = (0, node_util_1.debuglog)('oss-client:sign');
const OSS_PREFIX = 'x-oss-';
/**
* build canonicalized resource
* @see https://help.aliyun.com/zh/oss/developer-reference/include-signatures-in-the-authorization-header#section-rvv-dx2-xdb
*/
function buildCanonicalizedResource(resourcePath, parameters) {
let canonicalizedResource = `${resourcePath}`;
let separatorString = '?';
if (typeof parameters === 'string') {
if (parameters.trim()) {
canonicalizedResource += separatorString + parameters;
}
}
else if (Array.isArray(parameters)) {
parameters.sort();
canonicalizedResource += separatorString + parameters.join('&');
}
else if (parameters) {
const compareFunc = (entry1, entry2) => {
if (entry1[0] > entry2[0]) {
return 1;
}
else if (entry1[0] < entry2[0]) {
return -1;
}
return 0;
};
const processFunc = (key) => {
canonicalizedResource += separatorString + key;
if (parameters[key] || parameters[key] === 0) {
canonicalizedResource += `=${parameters[key]}`;
}
separatorString = '&';
};
for (const key of Object.keys(parameters).sort(compareFunc)) {
processFunc(key);
}
}
debug('canonicalizedResource: %o', canonicalizedResource);
return canonicalizedResource;
}
function lowercaseKeyHeader(headers) {
const lowercaseHeaders = {};
if (headers) {
for (const name in headers) {
lowercaseHeaders[name.toLowerCase()] = headers[name];
}
}
return lowercaseHeaders;
}
function buildCanonicalString(method, resourcePath, request, expiresTimestamp) {
const headers = lowercaseKeyHeader(request.headers);
const headersToSign = {};
const signContent = [
method.toUpperCase(),
headers['content-md5'] ?? '',
headers['content-type'],
expiresTimestamp || headers['x-oss-date'],
];
for (const key of Object.keys(headers)) {
if (key.startsWith(OSS_PREFIX)) {
headersToSign[key] = String(headers[key]).trim();
}
}
for (const key of Object.keys(headersToSign).sort()) {
signContent.push(`${key}:${headersToSign[key]}`);
}
signContent.push(buildCanonicalizedResource(resourcePath, request.parameters));
return signContent.join('\n');
}
function computeSignature(accessKeySecret, canonicalString) {
const signature = node_crypto_1.default.createHmac('sha1', accessKeySecret);
return signature.update(Buffer.from(canonicalString)).digest('base64');
}
function authorization(accessKeyId, accessKeySecret, canonicalString) {
// https://help.aliyun.com/zh/oss/developer-reference/include-signatures-in-the-authorization-header
return `OSS ${accessKeyId}:${computeSignature(accessKeySecret, canonicalString)}`;
}
function signatureForURL(accessKeySecret, options, resource, expiresTimestamp) {
const headers = {};
const subResource = options.subResource ?? {};
if (options.process) {
subResource['x-oss-process'] = options.process;
}
if (options.trafficLimit) {
subResource['x-oss-traffic-limit'] = `${options.trafficLimit}`;
}
if (options.response) {
const customResponseHeaders = options.response;
for (const k in customResponseHeaders) {
subResource[`response-${k.toLowerCase()}`] = customResponseHeaders[k];
}
}
if (options['Content-MD5'] && !options['content-md5']) {
options['content-md5'] = options['Content-MD5'];
}
if (options['Content-Md5'] && !options['content-md5']) {
options['content-md5'] = options['Content-Md5'];
}
if (options['content-md5']) {
headers['content-md5'] = options['content-md5'];
}
if (options['Content-Type'] && !options['content-type']) {
options['content-type'] = options['Content-Type'];
}
if (options['content-type']) {
headers['content-type'] = options['content-type'];
}
// copy other x-oss-* headers
for (const key in options) {
const lowerKey = key.toLowerCase();
if (lowerKey.startsWith('x-oss-')) {
headers[lowerKey] = options[key];
}
}
if (options.callback) {
const callbackOptions = (0, encodeCallback_js_1.encodeCallback)(options.callback);
subResource.callback = callbackOptions.callback;
if (callbackOptions.callbackVar) {
subResource['callback-var'] = callbackOptions.callbackVar;
}
}
const canonicalString = buildCanonicalString(options.method, resource, {
headers,
parameters: subResource,
}, `${expiresTimestamp}`);
return {
Signature: computeSignature(accessKeySecret, canonicalString),
subResource,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFnRUEsb0RBNkJDO0FBRUQsNENBTUM7QUFFRCxzQ0FPQztBQUVELDBDQXNFQztBQXRMRCx5Q0FBcUM7QUFDckMsOERBQWlDO0FBTWpDLDJEQUFxRDtBQUVyRCxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMxQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUM7QUFFNUI7OztHQUdHO0FBQ0gsU0FBUywwQkFBMEIsQ0FDakMsWUFBb0IsRUFDcEIsVUFBOEI7SUFFOUIsSUFBSSxxQkFBcUIsR0FBRyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQzlDLElBQUksZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUUxQixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdEIscUJBQXFCLElBQUksZUFBZSxHQUFHLFVBQVUsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3JDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixxQkFBcUIsSUFBSSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRSxDQUFDO1NBQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO2lCQUFNLElBQUksTUFBTSxD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