Firma de tokens jwt propios para las solicitues

This commit is contained in:
2026-01-27 12:12:40 +01:00
parent 4cf7d11649
commit e8c278aa41
7 changed files with 125 additions and 9 deletions

View File

@@ -1,3 +1,5 @@
import { sign } from "node:crypto"
export type JWTHeader = {
alg: string,
typ: string,
@@ -42,6 +44,20 @@ export type JWT<T> = {
signature: JWTSignature
}
// todo pasar a la clase JWT
function signJWT(args: {
algorythm: "sha256" | string,
data: string,
privateKey: string
}) {
const signature = sign(
args.algorythm,
Buffer.from(args.data),
args.privateKey
)
return signature
}
export class JWTToken<T> {
public rawToken: string
@@ -54,6 +70,37 @@ export class JWTToken<T> {
this.decodedPayload = this.decodePayload()
}
public static fromParts<T>(args: {
header: JWTHeader,
payload?: JWTPayload<T>,
sigantureData?: {
privateKey: string,
algorythm: string
}
}) {
const strHeader = JSON.stringify(args.header)
const base64Header = Buffer.from(strHeader).toString("base64url")
let msg = base64Header
if (args.payload != undefined) {
const strPayload = JSON.stringify(args.payload)
const base64payload = Buffer.from(strPayload).toString("base64url")
msg += ("." + base64payload)
}
if (args.sigantureData != undefined) {
const base64signature = signJWT({
algorythm: args.sigantureData.algorythm,
privateKey: args.sigantureData.privateKey,
data: msg
}).toString("base64url")
msg += ("." + base64signature)
}
console.log("JWT", msg)
}
private decodePayload(): JWTPayload<T> {
if (this.rawToken == undefined) throw new Error("La clase no tiene un token definido")
const rawTokenPayload = this.rawToken.split(".")[1]