@atproto/oauth-provider 0.7.10 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/customization/branding.d.ts +7 -7
  3. package/dist/customization/customization.d.ts +10 -10
  4. package/dist/customization/links.d.ts +4 -4
  5. package/dist/dpop/dpop-manager.d.ts +2 -10
  6. package/dist/dpop/dpop-manager.d.ts.map +1 -1
  7. package/dist/dpop/dpop-manager.js +107 -65
  8. package/dist/dpop/dpop-manager.js.map +1 -1
  9. package/dist/dpop/dpop-proof.d.ts +7 -0
  10. package/dist/dpop/dpop-proof.d.ts.map +1 -0
  11. package/dist/dpop/dpop-proof.js +3 -0
  12. package/dist/dpop/dpop-proof.js.map +1 -0
  13. package/dist/lib/hcaptcha.d.ts +3 -3
  14. package/dist/lib/util/authorization-header.d.ts +1 -1
  15. package/dist/lib/util/authorization-header.d.ts.map +1 -1
  16. package/dist/lib/util/authorization-header.js +1 -1
  17. package/dist/lib/util/authorization-header.js.map +1 -1
  18. package/dist/lib/util/cast.d.ts +6 -0
  19. package/dist/lib/util/cast.d.ts.map +1 -1
  20. package/dist/lib/util/cast.js +13 -0
  21. package/dist/lib/util/cast.js.map +1 -1
  22. package/dist/oauth-provider.d.ts +6 -6
  23. package/dist/oauth-provider.d.ts.map +1 -1
  24. package/dist/oauth-provider.js +14 -14
  25. package/dist/oauth-provider.js.map +1 -1
  26. package/dist/oauth-verifier.d.ts +5 -7
  27. package/dist/oauth-verifier.d.ts.map +1 -1
  28. package/dist/oauth-verifier.js +15 -17
  29. package/dist/oauth-verifier.js.map +1 -1
  30. package/dist/request/request-manager.d.ts +3 -2
  31. package/dist/request/request-manager.d.ts.map +1 -1
  32. package/dist/request/request-manager.js +12 -7
  33. package/dist/request/request-manager.js.map +1 -1
  34. package/dist/router/create-oauth-middleware.js +4 -4
  35. package/dist/router/create-oauth-middleware.js.map +1 -1
  36. package/dist/signer/api-token-payload.d.ts +3 -3
  37. package/dist/signer/api-token-payload.d.ts.map +1 -1
  38. package/dist/signer/signed-token-payload.d.ts +3 -3
  39. package/dist/signer/signed-token-payload.d.ts.map +1 -1
  40. package/dist/token/token-manager.d.ts +4 -3
  41. package/dist/token/token-manager.d.ts.map +1 -1
  42. package/dist/token/token-manager.js +14 -11
  43. package/dist/token/token-manager.js.map +1 -1
  44. package/dist/token/verify-token-claims.d.ts +4 -2
  45. package/dist/token/verify-token-claims.d.ts.map +1 -1
  46. package/dist/token/verify-token-claims.js +29 -14
  47. package/dist/token/verify-token-claims.js.map +1 -1
  48. package/package.json +8 -8
  49. package/src/dpop/dpop-manager.ts +129 -74
  50. package/src/dpop/dpop-proof.ts +6 -0
  51. package/src/lib/util/authorization-header.ts +2 -2
  52. package/src/lib/util/cast.ts +14 -0
  53. package/src/oauth-provider.ts +20 -16
  54. package/src/oauth-verifier.ts +35 -32
  55. package/src/request/request-manager.ts +11 -9
  56. package/src/router/create-oauth-middleware.ts +6 -6
  57. package/src/token/token-manager.ts +14 -11
  58. package/src/token/verify-token-claims.ts +46 -17
  59. package/tsconfig.build.tsbuildinfo +1 -1
@@ -16,6 +16,8 @@ import { DeviceId } from '../device/device-id.js'
16
16
  import { AccessDeniedError } from '../errors/access-denied-error.js'
17
17
  import { ConsentRequiredError } from '../errors/consent-required-error.js'
18
18
  import { InvalidAuthorizationDetailsError } from '../errors/invalid-authorization-details-error.js'
19
+ import { InvalidDpopKeyBindingError } from '../errors/invalid-dpop-key-binding-error.js'
20
+ import { InvalidDpopProofError } from '../errors/invalid-dpop-proof-error.js'
19
21
  import { InvalidGrantError } from '../errors/invalid-grant-error.js'
20
22
  import { InvalidParametersError } from '../errors/invalid-parameters-error.js'
21
23
  import { InvalidRequestError } from '../errors/invalid-request-error.js'
@@ -23,6 +25,7 @@ import { InvalidScopeError } from '../errors/invalid-scope-error.js'
23
25
  import { RequestMetadata } from '../lib/http/request.js'
24
26
  import { callAsync } from '../lib/util/function.js'
25
27
  import { OAuthHooks } from '../oauth-hooks.js'
28
+ import { DpopProof } from '../oauth-verifier.js'
26
29
  import { Signer } from '../signer/signer.js'
27
30
  import { Code, generateCode } from './code.js'
28
31
  import {
@@ -56,9 +59,9 @@ export class RequestManager {
56
59
  clientAuth: ClientAuth,
57
60
  input: Readonly<OAuthAuthorizationRequestParameters>,
58
61
  deviceId: null | DeviceId,
59
- dpopJkt: null | string,
62
+ dpopProof: null | DpopProof,
60
63
  ): Promise<RequestInfo> {
61
- const parameters = await this.validate(client, clientAuth, input, dpopJkt)
64
+ const parameters = await this.validate(client, clientAuth, input, dpopProof)
62
65
  return this.create(client, clientAuth, parameters, deviceId)
63
66
  }
64
67
 
@@ -89,7 +92,7 @@ export class RequestManager {
89
92
  client: Client,
90
93
  clientAuth: ClientAuth,
91
94
  parameters: Readonly<OAuthAuthorizationRequestParameters>,
92
- dpop_jkt: null | string,
95
+ dpopProof: null | DpopProof,
93
96
  ): Promise<Readonly<OAuthAuthorizationRequestParameters>> {
94
97
  // -------------------------------
95
98
  // Validate unsupported parameters
@@ -196,12 +199,11 @@ export class RequestManager {
196
199
 
197
200
  // https://datatracker.ietf.org/doc/html/rfc9449#section-10
198
201
  if (!parameters.dpop_jkt) {
199
- if (dpop_jkt) parameters = { ...parameters, dpop_jkt }
200
- } else if (parameters.dpop_jkt !== dpop_jkt) {
201
- throw new InvalidParametersError(
202
- parameters,
203
- '"dpop_jkt" parameters does not match the DPoP proof',
204
- )
202
+ if (dpopProof) parameters = { ...parameters, dpop_jkt: dpopProof.jkt }
203
+ } else if (!dpopProof) {
204
+ throw new InvalidDpopProofError('DPoP proof required')
205
+ } else if (parameters.dpop_jkt !== dpopProof.jkt) {
206
+ throw new InvalidDpopKeyBindingError()
205
207
  }
206
208
 
207
209
  if (clientAuth.method === CLIENT_ASSERTION_TYPE_JWT_BEARER) {
@@ -101,16 +101,16 @@ export function createOAuthMiddleware<
101
101
  .parseAsync(payload, { path: ['body'] })
102
102
  .catch(throwInvalidRequest)
103
103
 
104
- const dpopJkt = await server.checkDpopProof(
105
- req.headers['dpop'],
104
+ const dpopProof = await server.checkDpopProof(
106
105
  req.method!,
107
106
  this.url,
107
+ req.headers,
108
108
  )
109
109
 
110
110
  return server.pushedAuthorizationRequest(
111
111
  credentials,
112
112
  authorizationRequest,
113
- dpopJkt,
113
+ dpopProof,
114
114
  )
115
115
  }, 201),
116
116
  )
@@ -138,17 +138,17 @@ export function createOAuthMiddleware<
138
138
  .parseAsync(payload, { path: ['body'] })
139
139
  .catch(throwInvalidGrant)
140
140
 
141
- const dpopJkt = await server.checkDpopProof(
142
- req.headers['dpop'],
141
+ const dpopProof = await server.checkDpopProof(
143
142
  req.method!,
144
143
  this.url,
144
+ req.headers,
145
145
  )
146
146
 
147
147
  return server.token(
148
148
  clientCredentials,
149
149
  clientMetadata,
150
150
  tokenRequest,
151
- dpopJkt,
151
+ dpopProof,
152
152
  )
153
153
  }),
154
154
  )
@@ -32,6 +32,7 @@ import { RequestMetadata } from '../lib/http/request.js'
32
32
  import { dateToEpoch, dateToRelativeSeconds } from '../lib/util/date.js'
33
33
  import { callAsync } from '../lib/util/function.js'
34
34
  import { OAuthHooks } from '../oauth-hooks.js'
35
+ import { DpopProof } from '../oauth-verifier.js'
35
36
  import { Sub } from '../oidc/sub.js'
36
37
  import { Code, isCode } from '../request/code.js'
37
38
  import { SignedTokenPayload } from '../signer/signed-token-payload.js'
@@ -104,12 +105,12 @@ export class TokenManager {
104
105
  | OAuthAuthorizationCodeGrantTokenRequest
105
106
  | OAuthClientCredentialsGrantTokenRequest
106
107
  | OAuthPasswordGrantTokenRequest,
107
- dpopJkt: null | string,
108
+ dpopProof: null | DpopProof,
108
109
  ): Promise<OAuthTokenResponse> {
109
110
  // @NOTE the atproto specific DPoP requirement is enforced though the
110
111
  // "dpop_bound_access_tokens" metadata, which is enforced by the
111
112
  // ClientManager class.
112
- if (client.metadata.dpop_bound_access_tokens && !dpopJkt) {
113
+ if (client.metadata.dpop_bound_access_tokens && !dpopProof) {
113
114
  throw new InvalidDpopProofError('DPoP proof required')
114
115
  }
115
116
 
@@ -117,8 +118,10 @@ export class TokenManager {
117
118
  // Allow clients to bind their access tokens to a DPoP key during
118
119
  // token request if they didn't provide a "dpop_jkt" during the
119
120
  // authorization request.
120
- if (dpopJkt) parameters = { ...parameters, dpop_jkt: dpopJkt }
121
- } else if (parameters.dpop_jkt !== dpopJkt) {
121
+ if (dpopProof) parameters = { ...parameters, dpop_jkt: dpopProof.jkt }
122
+ } else if (!dpopProof) {
123
+ throw new InvalidDpopProofError('DPoP proof required')
124
+ } else if (parameters.dpop_jkt !== dpopProof.jkt) {
122
125
  throw new InvalidDpopKeyBindingError()
123
126
  }
124
127
 
@@ -347,7 +350,7 @@ export class TokenManager {
347
350
  clientAuth: ClientAuth,
348
351
  clientMetadata: RequestMetadata,
349
352
  input: OAuthRefreshTokenGrantTokenRequest,
350
- dpopJkt: null | string,
353
+ dpopProof: null | DpopProof,
351
354
  ): Promise<OAuthTokenResponse> {
352
355
  const refreshTokenParsed = refreshTokenSchema.safeParse(input.refresh_token)
353
356
  if (!refreshTokenParsed.success) {
@@ -381,9 +384,9 @@ export class TokenManager {
381
384
  }
382
385
 
383
386
  if (parameters.dpop_jkt) {
384
- if (!dpopJkt) {
387
+ if (!dpopProof) {
385
388
  throw new InvalidDpopProofError('DPoP proof required')
386
- } else if (parameters.dpop_jkt !== dpopJkt) {
389
+ } else if (parameters.dpop_jkt !== dpopProof.jkt) {
387
390
  throw new InvalidDpopKeyBindingError()
388
391
  }
389
392
  }
@@ -531,7 +534,7 @@ export class TokenManager {
531
534
  token: OAuthAccessToken,
532
535
  tokenType: OAuthTokenType,
533
536
  tokenId: TokenId,
534
- dpopJkt: string | null,
537
+ dpopProof: null | DpopProof,
535
538
  verifyOptions?: VerifyTokenClaimsOptions,
536
539
  ): Promise<VerifyTokenClaimsResult> {
537
540
  const tokenInfo = await this.getTokenInfo(tokenId).catch((err) => {
@@ -547,7 +550,7 @@ export class TokenManager {
547
550
  const { parameters } = data
548
551
 
549
552
  // Construct a list of claim, as if the token was a JWT.
550
- const claims: SignedTokenPayload = {
553
+ const tokenClaims: SignedTokenPayload = {
551
554
  iss: this.signer.issuer,
552
555
  jti: tokenId,
553
556
  sub: account.sub,
@@ -566,8 +569,8 @@ export class TokenManager {
566
569
  token,
567
570
  tokenId,
568
571
  tokenType,
569
- dpopJkt,
570
- claims,
572
+ tokenClaims,
573
+ dpopProof,
571
574
  verifyOptions,
572
575
  )
573
576
  }
@@ -3,9 +3,13 @@ import { InvalidDpopKeyBindingError } from '../errors/invalid-dpop-key-binding-e
3
3
  import { InvalidDpopProofError } from '../errors/invalid-dpop-proof-error.js'
4
4
  import { asArray } from '../lib/util/cast.js'
5
5
  import { InvalidTokenError } from '../oauth-errors.js'
6
+ import { DpopProof } from '../oauth-verifier.js'
6
7
  import { SignedTokenPayload } from '../signer/signed-token-payload.js'
7
8
  import { TokenId } from './token-id.js'
8
9
 
10
+ const BEARER = 'Bearer' satisfies OAuthTokenType
11
+ const DPOP = 'DPoP' satisfies OAuthTokenType
12
+
9
13
  export type VerifyTokenClaimsOptions = {
10
14
  /** One of these audience must be included in the token audience(s) */
11
15
  audience?: [string, ...string[]]
@@ -17,48 +21,73 @@ export type VerifyTokenClaimsResult = {
17
21
  token: OAuthAccessToken
18
22
  tokenId: TokenId
19
23
  tokenType: OAuthTokenType
20
- claims: SignedTokenPayload
24
+ tokenClaims: SignedTokenPayload
25
+ dpopProof: null | DpopProof
21
26
  }
22
27
 
23
28
  export function verifyTokenClaims(
24
29
  token: OAuthAccessToken,
25
30
  tokenId: TokenId,
26
31
  tokenType: OAuthTokenType,
27
- dpopJkt: string | null,
28
- claims: SignedTokenPayload,
32
+ tokenClaims: SignedTokenPayload,
33
+ dpopProof: null | DpopProof,
29
34
  options?: VerifyTokenClaimsOptions,
30
35
  ): VerifyTokenClaimsResult {
31
36
  const dateReference = Date.now()
32
- const claimsJkt = claims.cnf?.jkt ?? null
33
37
 
34
- const expectedTokenType: OAuthTokenType = claimsJkt ? 'DPoP' : 'Bearer'
35
- if (expectedTokenType !== tokenType) {
36
- throw new InvalidTokenError(expectedTokenType, `Invalid token type`)
37
- }
38
- if (tokenType === 'DPoP' && !dpopJkt) {
39
- throw new InvalidDpopProofError(`jkt is required for DPoP tokens`)
40
- }
41
- if (claimsJkt !== dpopJkt) {
42
- throw new InvalidDpopKeyBindingError()
38
+ if (tokenClaims.cnf?.jkt) {
39
+ // An access token with a cnf.jkt claim must be a DPoP token
40
+ if (tokenType !== DPOP) {
41
+ throw new InvalidTokenError(
42
+ DPOP,
43
+ `Access token is bound to a DPoP proof, but token type is ${tokenType}`,
44
+ )
45
+ }
46
+
47
+ // DPoP token type must be used with a DPoP proof
48
+ if (!dpopProof) {
49
+ throw new InvalidDpopProofError(`DPoP proof required`)
50
+ }
51
+
52
+ // DPoP proof must be signed with the key that matches the "cnf" claim
53
+ if (tokenClaims.cnf.jkt !== dpopProof.jkt) {
54
+ throw new InvalidDpopKeyBindingError()
55
+ }
56
+ } else {
57
+ // An access token without a cnf.jkt claim must be a Bearer token
58
+ if (tokenType !== BEARER) {
59
+ throw new InvalidTokenError(
60
+ BEARER,
61
+ `Bearer token type must be used without a DPoP proof`,
62
+ )
63
+ }
64
+
65
+ // Unexpected DPoP proof received for a Bearer token
66
+ if (dpopProof) {
67
+ throw new InvalidTokenError(
68
+ BEARER,
69
+ `DPoP proof not expected for Bearer token type`,
70
+ )
71
+ }
43
72
  }
44
73
 
45
74
  if (options?.audience) {
46
- const aud = asArray(claims.aud)
75
+ const aud = asArray(tokenClaims.aud)
47
76
  if (!options.audience.some((v) => aud.includes(v))) {
48
77
  throw new InvalidTokenError(tokenType, `Invalid audience`)
49
78
  }
50
79
  }
51
80
 
52
81
  if (options?.scope) {
53
- const scopes = claims.scope?.split(' ')
82
+ const scopes = tokenClaims.scope?.split(' ')
54
83
  if (!scopes || !options.scope.some((v) => scopes.includes(v))) {
55
84
  throw new InvalidTokenError(tokenType, `Invalid scope`)
56
85
  }
57
86
  }
58
87
 
59
- if (claims.exp != null && claims.exp * 1000 <= dateReference) {
88
+ if (tokenClaims.exp != null && tokenClaims.exp * 1000 <= dateReference) {
60
89
  throw new InvalidTokenError(tokenType, `Token expired`)
61
90
  }
62
91
 
63
- return { token, tokenId, tokenType, claims }
92
+ return { token, tokenId, tokenType, tokenClaims, dpopProof }
64
93
  }
@@ -1 +1 @@
1
- {"root":["./src/constants.ts","./src/index.ts","./src/oauth-client.ts","./src/oauth-dpop.ts","./src/oauth-errors.ts","./src/oauth-hooks.ts","./src/oauth-middleware.ts","./src/oauth-provider.ts","./src/oauth-store.ts","./src/oauth-verifier.ts","./src/access-token/access-token-mode.ts","./src/account/account-manager.ts","./src/account/account-store.ts","./src/account/sign-in-data.ts","./src/account/sign-up-input.ts","./src/client/client-auth.ts","./src/client/client-data.ts","./src/client/client-id.ts","./src/client/client-info.ts","./src/client/client-manager.ts","./src/client/client-store.ts","./src/client/client-utils.ts","./src/client/client.ts","./src/customization/branding.ts","./src/customization/build-customization-css.ts","./src/customization/build-customization-data.ts","./src/customization/colors.ts","./src/customization/customization.ts","./src/customization/links.ts","./src/device/device-data.ts","./src/device/device-id.ts","./src/device/device-manager.ts","./src/device/device-store.ts","./src/device/session-id.ts","./src/dpop/dpop-manager.ts","./src/dpop/dpop-nonce.ts","./src/errors/access-denied-error.ts","./src/errors/account-selection-required-error.ts","./src/errors/consent-required-error.ts","./src/errors/error-parser.ts","./src/errors/handle-unavailable-error.ts","./src/errors/invalid-authorization-details-error.ts","./src/errors/invalid-client-error.ts","./src/errors/invalid-client-id-error.ts","./src/errors/invalid-client-metadata-error.ts","./src/errors/invalid-dpop-key-binding-error.ts","./src/errors/invalid-dpop-proof-error.ts","./src/errors/invalid-grant-error.ts","./src/errors/invalid-invite-code-error.ts","./src/errors/invalid-parameters-error.ts","./src/errors/invalid-redirect-uri-error.ts","./src/errors/invalid-request-error.ts","./src/errors/invalid-scope-error.ts","./src/errors/invalid-token-error.ts","./src/errors/login-required-error.ts","./src/errors/oauth-error.ts","./src/errors/second-authentication-factor-required-error.ts","./src/errors/unauthorized-client-error.ts","./src/errors/use-dpop-nonce-error.ts","./src/errors/www-authenticate-error.ts","./src/lib/hcaptcha.ts","./src/lib/redis.ts","./src/lib/send-web-page.ts","./src/lib/csp/index.ts","./src/lib/html/build-document.ts","./src/lib/html/escapers.ts","./src/lib/html/html.ts","./src/lib/html/hydration-data.ts","./src/lib/html/index.ts","./src/lib/html/tags.ts","./src/lib/html/util.ts","./src/lib/http/accept.ts","./src/lib/http/context.ts","./src/lib/http/headers.ts","./src/lib/http/index.ts","./src/lib/http/method.ts","./src/lib/http/middleware.ts","./src/lib/http/parser.ts","./src/lib/http/path.ts","./src/lib/http/request.ts","./src/lib/http/response.ts","./src/lib/http/route.ts","./src/lib/http/router.ts","./src/lib/http/security-headers.ts","./src/lib/http/stream.ts","./src/lib/http/types.ts","./src/lib/http/url.ts","./src/lib/util/authorization-header.ts","./src/lib/util/cast.ts","./src/lib/util/color.ts","./src/lib/util/crypto.ts","./src/lib/util/date.ts","./src/lib/util/function.ts","./src/lib/util/locale.ts","./src/lib/util/redirect-uri.ts","./src/lib/util/time.ts","./src/lib/util/type.ts","./src/lib/util/ui8.ts","./src/lib/util/well-known.ts","./src/lib/util/zod-error.ts","./src/metadata/build-metadata.ts","./src/oidc/sub.ts","./src/replay/replay-manager.ts","./src/replay/replay-store-memory.ts","./src/replay/replay-store-redis.ts","./src/replay/replay-store.ts","./src/request/code.ts","./src/request/request-data.ts","./src/request/request-id.ts","./src/request/request-info.ts","./src/request/request-manager.ts","./src/request/request-store-memory.ts","./src/request/request-store-redis.ts","./src/request/request-store.ts","./src/request/request-uri.ts","./src/result/authorization-redirect-parameters.ts","./src/result/authorization-result-authorize-page.ts","./src/result/authorization-result-redirect.ts","./src/router/create-account-page-middleware.ts","./src/router/create-api-middleware.ts","./src/router/create-authorization-page-middleware.ts","./src/router/create-oauth-middleware.ts","./src/router/error-handler.ts","./src/router/middleware-options.ts","./src/router/send-redirect.ts","./src/router/assets/assets-manifest.ts","./src/router/assets/assets.ts","./src/router/assets/csrf.ts","./src/router/assets/send-account-page.ts","./src/router/assets/send-authorization-page.ts","./src/router/assets/send-error-page.ts","./src/signer/api-token-payload.ts","./src/signer/signed-token-payload.ts","./src/signer/signer.ts","./src/token/refresh-token.ts","./src/token/token-data.ts","./src/token/token-id.ts","./src/token/token-manager.ts","./src/token/token-store.ts","./src/token/verify-token-claims.ts","./src/types/color-hue.ts","./src/types/email-otp.ts","./src/types/email.ts","./src/types/handle.ts","./src/types/invite-code.ts","./src/types/password.ts","./src/types/rgb-color.ts"],"version":"5.8.2"}
1
+ {"root":["./src/constants.ts","./src/index.ts","./src/oauth-client.ts","./src/oauth-dpop.ts","./src/oauth-errors.ts","./src/oauth-hooks.ts","./src/oauth-middleware.ts","./src/oauth-provider.ts","./src/oauth-store.ts","./src/oauth-verifier.ts","./src/access-token/access-token-mode.ts","./src/account/account-manager.ts","./src/account/account-store.ts","./src/account/sign-in-data.ts","./src/account/sign-up-input.ts","./src/client/client-auth.ts","./src/client/client-data.ts","./src/client/client-id.ts","./src/client/client-info.ts","./src/client/client-manager.ts","./src/client/client-store.ts","./src/client/client-utils.ts","./src/client/client.ts","./src/customization/branding.ts","./src/customization/build-customization-css.ts","./src/customization/build-customization-data.ts","./src/customization/colors.ts","./src/customization/customization.ts","./src/customization/links.ts","./src/device/device-data.ts","./src/device/device-id.ts","./src/device/device-manager.ts","./src/device/device-store.ts","./src/device/session-id.ts","./src/dpop/dpop-manager.ts","./src/dpop/dpop-nonce.ts","./src/dpop/dpop-proof.ts","./src/errors/access-denied-error.ts","./src/errors/account-selection-required-error.ts","./src/errors/consent-required-error.ts","./src/errors/error-parser.ts","./src/errors/handle-unavailable-error.ts","./src/errors/invalid-authorization-details-error.ts","./src/errors/invalid-client-error.ts","./src/errors/invalid-client-id-error.ts","./src/errors/invalid-client-metadata-error.ts","./src/errors/invalid-dpop-key-binding-error.ts","./src/errors/invalid-dpop-proof-error.ts","./src/errors/invalid-grant-error.ts","./src/errors/invalid-invite-code-error.ts","./src/errors/invalid-parameters-error.ts","./src/errors/invalid-redirect-uri-error.ts","./src/errors/invalid-request-error.ts","./src/errors/invalid-scope-error.ts","./src/errors/invalid-token-error.ts","./src/errors/login-required-error.ts","./src/errors/oauth-error.ts","./src/errors/second-authentication-factor-required-error.ts","./src/errors/unauthorized-client-error.ts","./src/errors/use-dpop-nonce-error.ts","./src/errors/www-authenticate-error.ts","./src/lib/hcaptcha.ts","./src/lib/redis.ts","./src/lib/send-web-page.ts","./src/lib/csp/index.ts","./src/lib/html/build-document.ts","./src/lib/html/escapers.ts","./src/lib/html/html.ts","./src/lib/html/hydration-data.ts","./src/lib/html/index.ts","./src/lib/html/tags.ts","./src/lib/html/util.ts","./src/lib/http/accept.ts","./src/lib/http/context.ts","./src/lib/http/headers.ts","./src/lib/http/index.ts","./src/lib/http/method.ts","./src/lib/http/middleware.ts","./src/lib/http/parser.ts","./src/lib/http/path.ts","./src/lib/http/request.ts","./src/lib/http/response.ts","./src/lib/http/route.ts","./src/lib/http/router.ts","./src/lib/http/security-headers.ts","./src/lib/http/stream.ts","./src/lib/http/types.ts","./src/lib/http/url.ts","./src/lib/util/authorization-header.ts","./src/lib/util/cast.ts","./src/lib/util/color.ts","./src/lib/util/crypto.ts","./src/lib/util/date.ts","./src/lib/util/function.ts","./src/lib/util/locale.ts","./src/lib/util/redirect-uri.ts","./src/lib/util/time.ts","./src/lib/util/type.ts","./src/lib/util/ui8.ts","./src/lib/util/well-known.ts","./src/lib/util/zod-error.ts","./src/metadata/build-metadata.ts","./src/oidc/sub.ts","./src/replay/replay-manager.ts","./src/replay/replay-store-memory.ts","./src/replay/replay-store-redis.ts","./src/replay/replay-store.ts","./src/request/code.ts","./src/request/request-data.ts","./src/request/request-id.ts","./src/request/request-info.ts","./src/request/request-manager.ts","./src/request/request-store-memory.ts","./src/request/request-store-redis.ts","./src/request/request-store.ts","./src/request/request-uri.ts","./src/result/authorization-redirect-parameters.ts","./src/result/authorization-result-authorize-page.ts","./src/result/authorization-result-redirect.ts","./src/router/create-account-page-middleware.ts","./src/router/create-api-middleware.ts","./src/router/create-authorization-page-middleware.ts","./src/router/create-oauth-middleware.ts","./src/router/error-handler.ts","./src/router/middleware-options.ts","./src/router/send-redirect.ts","./src/router/assets/assets-manifest.ts","./src/router/assets/assets.ts","./src/router/assets/csrf.ts","./src/router/assets/send-account-page.ts","./src/router/assets/send-authorization-page.ts","./src/router/assets/send-error-page.ts","./src/signer/api-token-payload.ts","./src/signer/signed-token-payload.ts","./src/signer/signer.ts","./src/token/refresh-token.ts","./src/token/token-data.ts","./src/token/token-id.ts","./src/token/token-manager.ts","./src/token/token-store.ts","./src/token/verify-token-claims.ts","./src/types/color-hue.ts","./src/types/email-otp.ts","./src/types/email.ts","./src/types/handle.ts","./src/types/invite-code.ts","./src/types/password.ts","./src/types/rgb-color.ts"],"version":"5.8.3"}