|
import {SignJWT} from 'jose'; |
|
import crypto from "node:crypto"; |
|
import {getEnv} from "./common.js"; |
|
|
|
const main = async () => { |
|
const auth0Domain = getEnv("AUTH0_DOMAIN"); |
|
const auth0ClientId = getEnv("AUTH0_CLIENT_ID"); |
|
const auth0Audience = getEnv("AUTH0_AUDIENCE"); |
|
|
|
const publicKeyId = getEnv("PUBLIC_KEY_ID"); |
|
const privateKeyPEM = getEnv("PRIVATE_KEY_PEM"); |
|
const privateKey = crypto.createPrivateKey(privateKeyPEM); |
|
console.log("") |
|
|
|
const jwt = await new SignJWT({}) |
|
.setProtectedHeader({alg: 'RS256', kid: publicKeyId}) |
|
.setIssuedAt() |
|
.setIssuer(auth0ClientId) |
|
.setSubject(auth0ClientId) |
|
.setAudience(`https://${auth0Domain}/`) |
|
.setExpirationTime('1m') |
|
.setJti(crypto.webcrypto.randomUUID()) |
|
.sign(privateKey); |
|
console.log(`[JWT to Issue Access Token]\n${jwt}\n`) |
|
|
|
const requestBody = new URLSearchParams({ |
|
audience: auth0Audience, |
|
client_assertion: jwt, |
|
client_assertion_type: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", |
|
grant_type: 'client_credentials', |
|
}) |
|
|
|
const response = await fetch(`https://${auth0Domain}/oauth/token`, { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/x-www-form-urlencoded", |
|
}, |
|
body: requestBody.toString(), |
|
}); |
|
|
|
console.log(`[Response Status]\n${response.status}\n`); |
|
const body = await response.text(); |
|
console.log(`[Response Body]\n${body}\n`); |
|
const {access_token: accessToken} = JSON.parse(body); |
|
console.log(`[Access Token]\n${accessToken}\n`); |
|
|
|
const [header, payload, signature] = accessToken.split(".") |
|
const parse = (str) => JSON.parse(Buffer.from(str, "base64url").toString("utf-8")) |
|
console.log(`[Header]\n${JSON.stringify(parse(header), null, 2)}\n`) |
|
console.log(`[Payload]\n${JSON.stringify(parse(payload), null, 2)}\n`) |
|
console.log(`[Signature]\n${signature}\n`) |
|
} |
|
|
|
main(); |