oss-client
Version:
Aliyun OSS(Object Storage Service) Node.js Client
136 lines • 11.6 kB
JavaScript
import { debuglog } from 'node:util';
import crypto from 'node:crypto';
import { encodeCallback } from './encodeCallback.js';
const debug = 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;
}
export 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');
}
export function computeSignature(accessKeySecret, canonicalString) {
const signature = crypto.createHmac('sha1', accessKeySecret);
return signature.update(Buffer.from(canonicalString)).digest('base64');
}
export 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)}`;
}
export 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 = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFNakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQUU1Qjs7O0dBR0c7QUFDSCxTQUFTLDBCQUEwQixDQUNqQyxZQUFvQixFQUNwQixVQUE4QjtJQUU5QixJQUFJLHFCQUFxQixHQUFHLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDOUMsSUFBSSxlQUFlLEdBQUcsR0FBRyxDQUFDO0lBRTFCLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0QixxQkFBcUIsSUFBSSxlQUFlLEdBQUcsVUFBVSxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLHFCQUFxQixJQUFJLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7U0FBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQ3JELElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7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