Firma de tokens jwt propios para las solicitues
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user