Created
April 17, 2026 10:48
-
-
Save scriptpapi/c1bcc2f7a82e6afa65031012a3f38c64 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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