UNPKG

@e280/authlocal

Version:

User-sovereign login system for everybody

41 lines (29 loc) 1.22 kB
import {decodeToken} from "../token/decode.js" import {verifyToken} from "../token/verify.js" import {verifyProof} from "../session/proof.js" import {ProofPayload} from "../session/types.js" import {ClaimPayload, VerifyClaimOptions} from "./types.js" export async function verifyClaim<C>({claimToken, appOrigins, allowedAudiences, atTime}: VerifyClaimOptions) { const claimPayload = decodeToken<ClaimPayload<C>>(claimToken).payload const {proofToken} = claimPayload.data const proofPayload = decodeToken<ProofPayload>(proofToken).payload if (!claimPayload.iss) throw new Error(`claim token is lacking "iss" field`) if (!proofPayload.aud) throw new Error(`proof token is lacking "aud" field`) if (claimPayload.iss !== proofPayload.aud) throw new Error(`claim token iss "${claimPayload.iss}" does not match proof token aud "${proofPayload.aud}"`) const proof = await verifyProof({proofToken, appOrigins, atTime}) const {data: {claim}} = await verifyToken<ClaimPayload<C>>( proof.sessionId, claimToken, { atTime, // claim must have been issued by your app allowedIssuers: appOrigins, // claim could include aud allowedAudiences, }, ) return {claim, proof, proofToken} }