Skip to content

Instantly share code, notes, and snippets.

@scriptpapi
Created April 17, 2026 10:48
Show Gist options
  • Select an option

  • Save scriptpapi/c1bcc2f7a82e6afa65031012a3f38c64 to your computer and use it in GitHub Desktop.

Select an option

Save scriptpapi/c1bcc2f7a82e6afa65031012a3f38c64 to your computer and use it in GitHub Desktop.
const crypto = require("crypto");
const accessKey = "YOUR_ACCESS_KEY";
const secretKey = "YOUR_SECRET_KEY";
const region = "YOUR_REGION";
const service = "s3";
const host = "YOUR_NAMESPACE.compat.objectstorage.YOUR_REGION.oraclecloud.com";
const endpoint = `https://${host}/`;
function hmac(key, data, encoding) {
return crypto.createHmac("sha256", key).update(data, "utf8").digest(encoding);
}
function sha256(data, encoding = "hex") {
return crypto.createHash("sha256").update(data, "utf8").digest(encoding);
}
function getSignatureKey(key, dateStamp, regionName, serviceName) {
const kDate = crypto.createHmac("sha256", "AWS4" + key).update(dateStamp).digest();
const kRegion = crypto.createHmac("sha256", kDate).update(regionName).digest();
const kService = crypto.createHmac("sha256", kRegion).update(serviceName).digest();
const kSigning = crypto.createHmac("sha256", kService).update("aws4_request").digest();
return kSigning;
}
async function listBuckets() {
const now = new Date();
const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); // YYYYMMDDTHHMMSSZ
const dateStamp = amzDate.slice(0, 8);
const method = "GET";
const canonicalUri = "/";
const canonicalQueryString = "";
const payload = "";
const payloadHash = sha256(payload);
const canonicalHeaders =
`host:${host}\n` +
`x-amz-content-sha256:${payloadHash}\n` +
`x-amz-date:${amzDate}\n`;
const signedHeaders = "host;x-amz-content-sha256;x-amz-date";
const canonicalRequest =
`${method}\n` +
`${canonicalUri}\n` +
`${canonicalQueryString}\n` +
`${canonicalHeaders}\n` +
`${signedHeaders}\n` +
`${payloadHash}`;
const algorithm = "AWS4-HMAC-SHA256";
const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`;
const stringToSign =
`${algorithm}\n` +
`${amzDate}\n` +
`${credentialScope}\n` +
`${sha256(canonicalRequest)}`;
const signingKey = getSignatureKey(secretKey, dateStamp, region, service);
const signature = crypto
.createHmac("sha256", signingKey)
.update(stringToSign, "utf8")
.digest("hex");
const authorizationHeader =
`${algorithm} ` +
`Credential=${accessKey}/${credentialScope}, ` +
`SignedHeaders=${signedHeaders}, ` +
`Signature=${signature}`;
const response = await fetch(endpoint, {
method: "GET",
headers: {
"x-amz-date": amzDate,
"x-amz-content-sha256": payloadHash,
"Authorization": authorizationHeader,
},
});
const text = await response.text();
console.log("status:", response.status);
console.log(text);
}
listBuckets().catch(console.error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment