UNPKG

oss-client

Version:

Aliyun OSS(Object Storage Service) Node.js Client

136 lines 11.6 kB
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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