UNPKG

@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth

Version:

126 lines (115 loc) 4.2 kB
import { AuthorizationRequest, RP, URI } from '@sphereon/did-auth-siop' import { ICreateAuthRequestArgs, IPresentationOptions, IRequiredContext, IRPOptions } from './types/ISIOPv2RP' import { createRPBuilder, getRequestVersion, getSigningAlgo } from './functions' import { v4 as uuidv4 } from 'uuid' import { JwtIssuer } from '@sphereon/oid4vc-common' import { ensureManagedIdentifierResult, isManagedIdentifierDidResult, isManagedIdentifierX5cResult, } from '@sphereon/ssi-sdk-ext.identifier-resolution' export class RPInstance { private _rp: RP | undefined private readonly _presentationOptions: IPresentationOptions | undefined private readonly _rpOptions: IRPOptions public constructor({ rpOpts, pexOpts }: { rpOpts: IRPOptions; pexOpts?: IPresentationOptions }) { this._rpOptions = rpOpts this._presentationOptions = pexOpts } public async get(context: IRequiredContext): Promise<RP> { if (!this._rp) { const builder = await createRPBuilder({ rpOpts: this._rpOptions, context, }) this._rp = builder.build() } return this._rp! } get rpOptions() { return this._rpOptions } get presentationOptions() { return this._presentationOptions } public async createAuthorizationRequestURI(createArgs: ICreateAuthRequestArgs, context: IRequiredContext): Promise<URI> { const { correlationId, queryId, claims, requestByReferenceURI, responseURI, responseURIType, callback, responseRedirectURI } = createArgs const nonce = createArgs.nonce ?? uuidv4() const state = createArgs.state ?? correlationId let jwtIssuer: JwtIssuer const idOpts = this.rpOptions.identifierOpts.idOpts const resolution = await ensureManagedIdentifierResult(idOpts, context) if (isManagedIdentifierDidResult(resolution)) { jwtIssuer = { didUrl: resolution.kid, method: 'did', alg: getSigningAlgo(resolution.key.type) } } else if (isManagedIdentifierX5cResult(resolution)) { if (!resolution.issuer) { return Promise.reject('missing issuer in idOpts') } jwtIssuer = { issuer: resolution.issuer, x5c: resolution.x5c, method: 'x5c', alg: getSigningAlgo(resolution.key.type), } } else { return Promise.reject(Error(`JWT issuer method ${resolution.method} not yet supported`)) } return await this.get(context).then((rp) => rp.createAuthorizationRequestURI({ version: getRequestVersion(this.rpOptions), correlationId, queryId, nonce, state, claims, requestByReferenceURI, responseURI, responseURIType, jwtIssuer, callback, responseRedirectURI, }), ) } public async createAuthorizationRequest( createArgs: Omit<ICreateAuthRequestArgs, 'queryId'>, context: IRequiredContext, ): Promise<AuthorizationRequest> { const { correlationId, claims, requestByReferenceURI, responseURI, responseURIType, responseRedirectURI } = createArgs const nonce = createArgs.nonce ?? uuidv4() const state = createArgs.state ?? correlationId const idOpts = this.rpOptions.identifierOpts.idOpts const resolution = await ensureManagedIdentifierResult(idOpts, context) let jwtIssuer: JwtIssuer if (isManagedIdentifierX5cResult(resolution) && resolution.issuer) { jwtIssuer = { method: resolution.method, alg: getSigningAlgo(resolution.key.type), x5c: resolution.x5c, issuer: resolution.issuer, } } else if (isManagedIdentifierDidResult(resolution)) { jwtIssuer = { method: resolution.method, alg: getSigningAlgo(resolution.key.type), didUrl: resolution.did, } } else { return Promise.reject(Error('Only did & x5c supported at present')) } return await this.get(context).then((rp) => rp.createAuthorizationRequest({ version: getRequestVersion(this.rpOptions), correlationId, nonce, state, claims, requestByReferenceURI, responseURIType, responseURI, jwtIssuer, responseRedirectURI, }), ) } }