import * as b64u from '../util/base64url.js'; import { decoder } from '../lib/buffer_utils.js'; import { JWTInvalid } from '../util/errors.js'; import { validateClaimsSet, JWTClaimsBuilder } from '../lib/jwt_claims_set.js'; export class UnsecuredJWT { #jwt; constructor(payload = {}) { this.#jwt = new JWTClaimsBuilder(payload); } encode() { const header = b64u.encode(JSON.stringify({ alg: 'none' })); const payload = b64u.encode(this.#jwt.data()); return `${header}.${payload}.`; } setIssuer(issuer) { this.#jwt.iss = issuer; return this; } setSubject(subject) { this.#jwt.sub = subject; return this; } setAudience(audience) { this.#jwt.aud = audience; return this; } setJti(jwtId) { this.#jwt.jti = jwtId; return this; } setNotBefore(input) { this.#jwt.nbf = input; return this; } setExpirationTime(input) { this.#jwt.exp = input; return this; } setIssuedAt(input) { this.#jwt.iat = input; return this; } static decode(jwt, options) { if (typeof jwt !== 'string') { throw new JWTInvalid('Unsecured JWT must be a string'); } const { 0: encodedHeader, 1: encodedPayload, 2: signature, length } = jwt.split('.'); if (length !== 3 || signature !== '') { throw new JWTInvalid('Invalid Unsecured JWT'); } let header; try { header = JSON.parse(decoder.decode(b64u.decode(encodedHeader))); if (header.alg !== 'none') throw new Error(); } catch { throw new JWTInvalid('Invalid Unsecured JWT'); } const payload = validateClaimsSet(header, b64u.decode(encodedPayload), options); return { payload, header }; } }