@e280/authlocal
Version:
User-sovereign login system for everybody
21 lines (14 loc) • 698 B
text/typescript
import {Base64url, Txt} from "@e280/stz"
import {Token} from "./types.js"
import {tokenHeader} from "./header.js"
import {sign} from "../crypto/crypto.js"
export async function signToken<P extends Token>(secret: string, payload: P): Promise<string> {
const headerBytes = Txt.bytes(JSON.stringify(tokenHeader))
const headerText = Base64url.string(headerBytes)
const payloadBytes = Txt.bytes(JSON.stringify(payload))
const payloadText = Base64url.string(payloadBytes)
const signingText = `${headerText}.${payloadText}`
const signingBytes = new TextEncoder().encode(signingText)
const signature = Base64url.string(await sign(signingBytes, secret))
return `${signingText}.${signature}`
}