Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: cleanup and fixes #54

Merged
merged 3 commits into from
Mar 15, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/oauth2/src/callbacks.ts
Original file line number Diff line number Diff line change
@@ -44,7 +44,7 @@ export type VerifyJwtCallback = (
>

export interface DecryptJweCallbackOptions {
jwk: Jwk
jwk?: Jwk
}

export type DecryptJweCallback = (
4 changes: 2 additions & 2 deletions packages/openid4vp/src/Openid4vpClient.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { CallbackContext } from '@openid4vc/oauth2'
import {} from './authorization-request/create-authorization-request'
import { parseOpenid4vpAuthorizationRequestPayload } from './authorization-request/parse-authorization-request-params'
import type { ParseOpenid4vpAuthRequestPayloadOptions } from './authorization-request/parse-authorization-request-params'
import type { ParseOpenid4vpAuthorizationRequestPayloadOptions } from './authorization-request/parse-authorization-request-params'
import {
type ResolveOpenid4vpAuthorizationRequestOptions,
resolveOpenid4vpAuthorizationRequest,
@@ -25,7 +25,7 @@ export interface Openid4vpClientOptions {
export class Openid4vpClient {
public constructor(private options: Openid4vpClientOptions) {}

public parseOpenid4vpAuthorizationRequestPayload(options: ParseOpenid4vpAuthRequestPayloadOptions) {
public parseOpenid4vpAuthorizationRequestPayload(options: ParseOpenid4vpAuthorizationRequestPayloadOptions) {
return parseOpenid4vpAuthorizationRequestPayload(options)
}

4 changes: 2 additions & 2 deletions packages/openid4vp/src/Openid4vpVerifier.ts
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ import {
createOpenid4vpAuthorizationRequest,
} from './authorization-request/create-authorization-request'
import {
type ParseOpenid4vpAuthRequestPayloadOptions,
type ParseOpenid4vpAuthorizationRequestPayloadOptions,
parseOpenid4vpAuthorizationRequestPayload,
} from './authorization-request/parse-authorization-request-params'
import {
@@ -36,7 +36,7 @@ export class Openid4vpVerifier {
return createOpenid4vpAuthorizationRequest({ ...options, callbacks: this.options.callbacks })
}

public parseOpenid4vpAuthorizationRequestPayload(options: ParseOpenid4vpAuthRequestPayloadOptions) {
public parseOpenid4vpAuthorizationRequestPayload(options: ParseOpenid4vpAuthorizationRequestPayloadOptions) {
return parseOpenid4vpAuthorizationRequestPayload(options)
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { type CallbackContext, type JwtSigner, Oauth2Error } from '@openid4vc/oauth2'
import { URL, URLSearchParams, objectToQueryParams, parseWithErrorHandling } from '@openid4vc/utils'
import { createJarAuthRequest } from '../jar/create-jar-auth-request'
import { createJarAuthorizationRequest } from '../jar/create-jar-authorization-request'
import {
type WalletVerificationOptions,
validateOpenid4vpAuthorizationRequestPayload,
@@ -15,7 +15,7 @@ import {

export interface CreateOpenid4vpAuthorizationRequestOptions {
scheme?: string
requestPayload: Openid4vpAuthorizationRequest | Openid4vpAuthorizationRequestDcApi
authorizationRequestPayload: Openid4vpAuthorizationRequest | Openid4vpAuthorizationRequestDcApi
jar?: {
requestUri?: string
jwtSigner: JwtSigner
@@ -31,7 +31,7 @@ export interface CreateOpenid4vpAuthorizationRequestOptions {
*
* @param options Configuration options for creating the authorization request
* @param input.scheme Optional URI scheme to use (defaults to 'openid4vp://')
* @param input.requestParams The OpenID4VP authorization request parameters
* @param input.authorizationRequestPayload The OpenID4VP authorization request parameters
* @param input.jar Optional JWT Secured Authorization Request (JAR) configuration
* @param input.jar.requestUri The URI where the JAR will be accessible
* @param input.jar.jwtSigner Function to sign the JAR JWT
@@ -43,74 +43,77 @@ export interface CreateOpenid4vpAuthorizationRequestOptions {
* @returns Object containing the authorization request parameters, URI and optional JAR details
*/
export async function createOpenid4vpAuthorizationRequest(options: CreateOpenid4vpAuthorizationRequestOptions) {
const { jar, scheme = 'openid4vp://', requestPayload, wallet, callbacks } = options
const { jar, scheme = 'openid4vp://', wallet, callbacks } = options

let additionalJwtPayload: Record<string, unknown> | undefined

let authRequestParams: Openid4vpAuthorizationRequest | Openid4vpAuthorizationRequestDcApi
if (isOpenid4vpAuthorizationRequestDcApi(requestPayload)) {
authRequestParams = parseWithErrorHandling(
let authorizationRequestPayload: Openid4vpAuthorizationRequest | Openid4vpAuthorizationRequestDcApi
if (isOpenid4vpAuthorizationRequestDcApi(options.authorizationRequestPayload)) {
authorizationRequestPayload = parseWithErrorHandling(
zOpenid4vpAuthorizationRequestDcApi,
requestPayload,
options.authorizationRequestPayload,
'Invalid authorization request. Could not parse openid4vp dc_api authorization request.'
)

if (jar && !authRequestParams.expected_origins) {
if (jar && !authorizationRequestPayload.expected_origins) {
throw new Oauth2Error(
`The 'expected_origins' parameter MUST be present when using the dc_api response mode in combination with jar.`
)
}

validateOpenid4vpAuthorizationRequestDcApiPayload({
params: authRequestParams,
params: authorizationRequestPayload,
isJarRequest: Boolean(jar),
omitOriginValidation: true,
disableOriginValidation: true,
})
} else {
authRequestParams = parseWithErrorHandling(
authorizationRequestPayload = parseWithErrorHandling(
zOpenid4vpAuthorizationRequest,
requestPayload,
options.authorizationRequestPayload,
'Invalid authorization request. Could not parse openid4vp authorization request.'
)
validateOpenid4vpAuthorizationRequestPayload({ params: authRequestParams, walletVerificationOptions: wallet })
validateOpenid4vpAuthorizationRequestPayload({
params: authorizationRequestPayload,
walletVerificationOptions: wallet,
})
}

if (jar) {
if (!jar.additionalJwtPayload?.aud) {
additionalJwtPayload = { ...jar.additionalJwtPayload, aud: jar.requestUri }
}
}

if (jar) {
const jarResult = await createJarAuthRequest({
const jarResult = await createJarAuthorizationRequest({
...jar,
authRequestParams: requestPayload,
authorizationRequestPayload,
additionalJwtPayload,
callbacks,
})

const url = new URL(scheme)
url.search = `?${new URLSearchParams([
...url.searchParams.entries(),
...objectToQueryParams(jarResult.requestParams).entries(),
...objectToQueryParams(jarResult.jarAuthorizationRequest).entries(),
]).toString()}`

return {
authRequestObject: jarResult.requestParams,
authRequest: url.toString(),
authorizationRequestPayload,
authorizationRequestObject: jarResult.jarAuthorizationRequest,
authorizationRequest: url.toString(),
jar: { ...jar, ...jarResult },
}
}

const url = new URL(scheme)
url.search = `?${new URLSearchParams([
...url.searchParams.entries(),
...objectToQueryParams(requestPayload).entries(),
...objectToQueryParams(authorizationRequestPayload).entries(),
]).toString()}`

return {
authRequestObject: requestPayload,
authRequest: url.toString(),
authorizationRequestPayload,
authorizationRequestObject: authorizationRequestPayload,
authorizationRequest: url.toString(),
jar: undefined,
}
}
Original file line number Diff line number Diff line change
@@ -2,7 +2,11 @@ import { decodeJwt } from '@openid4vc/oauth2'
import { URL } from '@openid4vc/utils'
import { parseWithErrorHandling } from '@openid4vc/utils'
import z from 'zod'
import { type JarAuthRequest, isJarAuthRequest, zJarAuthRequest } from '../jar/z-jar-auth-request'
import {
type JarAuthorizationRequest,
isJarAuthorizationRequest,
zJarAuthorizationRequest,
} from '../jar/z-jar-authorization-request'
import { type Openid4vpAuthorizationRequest, zOpenid4vpAuthorizationRequest } from './z-authorization-request'
import {
type Openid4vpAuthorizationRequestDcApi,
@@ -13,28 +17,28 @@ import {
export interface ParsedJarRequest {
type: 'jar'
provided: 'uri' | 'jwt' | 'params'
params: JarAuthRequest
params: JarAuthorizationRequest
}

export interface ParsedOpenid4vpAuthRequest {
export interface ParsedOpenid4vpAuthorizationRequest {
type: 'openid4vp'
provided: 'uri' | 'jwt' | 'params'
params: Openid4vpAuthorizationRequest
}

export interface ParsedOpenid4vpDcApiAuthRequest {
export interface ParsedOpenid4vpDcApiAuthorizationRequest {
type: 'openid4vp_dc_api'
provided: 'uri' | 'jwt' | 'params'
params: Openid4vpAuthorizationRequestDcApi
}

export interface ParseOpenid4vpAuthRequestPayloadOptions {
export interface ParseOpenid4vpAuthorizationRequestPayloadOptions {
authorizationRequest: string | Record<string, unknown>
}

export function parseOpenid4vpAuthorizationRequestPayload(
options: ParseOpenid4vpAuthRequestPayloadOptions
): ParsedOpenid4vpAuthRequest | ParsedJarRequest | ParsedOpenid4vpDcApiAuthRequest {
options: ParseOpenid4vpAuthorizationRequestPayloadOptions
): ParsedOpenid4vpAuthorizationRequest | ParsedJarRequest | ParsedOpenid4vpDcApiAuthorizationRequest {
const { authorizationRequest } = options
let provided: 'uri' | 'jwt' | 'params' = 'params'

@@ -54,11 +58,11 @@ export function parseOpenid4vpAuthorizationRequestPayload(
}

const parsedRequest = parseWithErrorHandling(
z.union([zOpenid4vpAuthorizationRequest, zJarAuthRequest, zOpenid4vpAuthorizationRequestDcApi]),
z.union([zOpenid4vpAuthorizationRequest, zJarAuthorizationRequest, zOpenid4vpAuthorizationRequestDcApi]),
params
)

if (isJarAuthRequest(parsedRequest)) {
if (isJarAuthorizationRequest(parsedRequest)) {
return {
type: 'jar',
provided,
Loading