@sphereon/oid4vci-issuer
Version:
OpenID 4 Verifiable Credential Issuance issuer REST endpoints
31 lines (27 loc) • 1.34 kB
text/typescript
import { decodeJwt, decodeProtectedHeader } from '@sphereon/oid4vc-common'
import { ClientMetadata, JWTHeader, JWTVerifyCallback, JwtVerifyResult } from '@sphereon/oid4vci-common'
import { oidcDiscoverIssuer, oidcGetClient } from '@sphereon/ssi-express-support'
export function oidcAccessTokenVerifyCallback(opts: {
credentialIssuer: string
authorizationServer: string
clientMetadata?: ClientMetadata
}): JWTVerifyCallback {
const clientMetadata = opts.clientMetadata ?? { client_id: opts.credentialIssuer }
return async (args: { jwt: string; kid?: string }): Promise<JwtVerifyResult> => {
const oidcIssuer = await oidcDiscoverIssuer({ issuerUrl: opts.authorizationServer })
const oidcClient = await oidcGetClient(oidcIssuer.issuer, clientMetadata)
const introspection = await oidcClient.introspect(args.jwt)
if (!introspection.active) {
return Promise.reject(Error('Access token is not active or invalid'))
}
const jwt = { header: decodeProtectedHeader(args.jwt) as JWTHeader, payload: decodeJwt(args.jwt) }
return {
jwt,
alg: jwt.header.alg,
...(jwt.header.jwk && { jwk: jwt.header.jwk }),
...(jwt.header.x5c && { x5c: jwt.header.x5c }),
...(jwt.header.kid && { kid: jwt.header.kid }),
// We could resolve the did document here if the kid is a VM
}
}
}