@geekmidas/auth 10.0.0-alpha.11 → 10.0.0-alpha.110

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 (128) hide show
  1. package/dist/{cacheTokenStorage-DaqxdNxI.d.mts → cacheTokenStorage-B3u8Sf-6.d.cts} +2 -5
  2. package/dist/cacheTokenStorage-B3u8Sf-6.d.cts.map +1 -0
  3. package/dist/{cacheTokenStorage-B7sOoysu.d.cts → cacheTokenStorage-B3u8Sf-6.d.mts} +2 -5
  4. package/dist/cacheTokenStorage-B3u8Sf-6.d.mts.map +1 -0
  5. package/dist/cacheTokenStorage.cjs +30 -2
  6. package/dist/cacheTokenStorage.cjs.map +1 -0
  7. package/dist/cacheTokenStorage.d.cts +1 -1
  8. package/dist/cacheTokenStorage.d.mts +1 -1
  9. package/dist/cacheTokenStorage.mjs +29 -2
  10. package/dist/cacheTokenStorage.mjs.map +1 -0
  11. package/dist/client.cjs +144 -6
  12. package/dist/client.cjs.map +1 -0
  13. package/dist/client.d.cts +1 -1
  14. package/dist/client.d.mts +1 -1
  15. package/dist/client.mjs +140 -3
  16. package/dist/client.mjs.map +1 -0
  17. package/dist/cookies.cjs +24 -2
  18. package/dist/cookies.cjs.map +1 -0
  19. package/dist/cookies.d.cts +1 -3
  20. package/dist/cookies.d.cts.map +1 -1
  21. package/dist/cookies.d.mts +1 -3
  22. package/dist/cookies.d.mts.map +1 -1
  23. package/dist/cookies.mjs +23 -2
  24. package/dist/cookies.mjs.map +1 -0
  25. package/dist/hono/jwt.cjs +5 -5
  26. package/dist/hono/jwt.cjs.map +1 -1
  27. package/dist/hono/jwt.d.cts +4 -6
  28. package/dist/hono/jwt.d.cts.map +1 -1
  29. package/dist/hono/jwt.d.mts +4 -6
  30. package/dist/hono/jwt.d.mts.map +1 -1
  31. package/dist/hono/jwt.mjs +4 -5
  32. package/dist/hono/jwt.mjs.map +1 -1
  33. package/dist/hono/oidc.cjs +5 -5
  34. package/dist/hono/oidc.cjs.map +1 -1
  35. package/dist/hono/oidc.d.cts +5 -7
  36. package/dist/hono/oidc.d.cts.map +1 -1
  37. package/dist/hono/oidc.d.mts +5 -7
  38. package/dist/hono/oidc.d.mts.map +1 -1
  39. package/dist/hono/oidc.mjs +4 -5
  40. package/dist/hono/oidc.mjs.map +1 -1
  41. package/dist/index.cjs +5 -5
  42. package/dist/index.d.cts +2 -2
  43. package/dist/index.d.mts +2 -2
  44. package/dist/index.mjs +4 -5
  45. package/dist/{jwt-kejix7rd.d.mts → jwt-CoKrpeMB.d.cts} +2 -3
  46. package/dist/jwt-CoKrpeMB.d.cts.map +1 -0
  47. package/dist/{jwt-3eIuY2dg.d.cts → jwt-CoKrpeMB.d.mts} +2 -3
  48. package/dist/jwt-CoKrpeMB.d.mts.map +1 -0
  49. package/dist/jwt.cjs +56 -4
  50. package/dist/jwt.cjs.map +1 -0
  51. package/dist/jwt.d.cts +1 -1
  52. package/dist/jwt.d.mts +1 -1
  53. package/dist/jwt.mjs +51 -2
  54. package/dist/jwt.mjs.map +1 -0
  55. package/dist/lambda/jwt.cjs +14 -17
  56. package/dist/lambda/jwt.cjs.map +1 -1
  57. package/dist/lambda/jwt.d.cts +4 -6
  58. package/dist/lambda/jwt.d.cts.map +1 -1
  59. package/dist/lambda/jwt.d.mts +4 -6
  60. package/dist/lambda/jwt.d.mts.map +1 -1
  61. package/dist/lambda/jwt.mjs +13 -17
  62. package/dist/lambda/jwt.mjs.map +1 -1
  63. package/dist/lambda/oidc.cjs +14 -17
  64. package/dist/lambda/oidc.cjs.map +1 -1
  65. package/dist/lambda/oidc.d.cts +5 -7
  66. package/dist/lambda/oidc.d.cts.map +1 -1
  67. package/dist/lambda/oidc.d.mts +5 -7
  68. package/dist/lambda/oidc.d.mts.map +1 -1
  69. package/dist/lambda/oidc.mjs +13 -17
  70. package/dist/lambda/oidc.mjs.map +1 -1
  71. package/dist/oidc.cjs +64 -2
  72. package/dist/oidc.cjs.map +1 -0
  73. package/dist/oidc.d.cts +84 -3
  74. package/dist/oidc.d.cts.map +1 -0
  75. package/dist/oidc.d.mts +84 -3
  76. package/dist/oidc.d.mts.map +1 -0
  77. package/dist/oidc.mjs +61 -2
  78. package/dist/oidc.mjs.map +1 -0
  79. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
  80. package/dist/server.cjs +4 -4
  81. package/dist/server.d.cts +3 -3
  82. package/dist/server.d.mts +3 -3
  83. package/dist/server.mjs +3 -4
  84. package/dist/tokenManager.cjs +64 -2
  85. package/dist/tokenManager.cjs.map +1 -0
  86. package/dist/tokenManager.d.cts +37 -2
  87. package/dist/tokenManager.d.cts.map +1 -0
  88. package/dist/tokenManager.d.mts +37 -2
  89. package/dist/tokenManager.d.mts.map +1 -0
  90. package/dist/tokenManager.mjs +61 -2
  91. package/dist/tokenManager.mjs.map +1 -0
  92. package/package.json +5 -4
  93. package/dist/cacheTokenStorage-16NE8Cd9.mjs +0 -32
  94. package/dist/cacheTokenStorage-16NE8Cd9.mjs.map +0 -1
  95. package/dist/cacheTokenStorage-B7sOoysu.d.cts.map +0 -1
  96. package/dist/cacheTokenStorage-CEpMniTi.cjs +0 -38
  97. package/dist/cacheTokenStorage-CEpMniTi.cjs.map +0 -1
  98. package/dist/cacheTokenStorage-DaqxdNxI.d.mts.map +0 -1
  99. package/dist/client-BPl_mMvb.cjs +0 -162
  100. package/dist/client-BPl_mMvb.cjs.map +0 -1
  101. package/dist/client-eidYNJSH.mjs +0 -144
  102. package/dist/client-eidYNJSH.mjs.map +0 -1
  103. package/dist/cookies-Bc6gUjb6.cjs +0 -30
  104. package/dist/cookies-Bc6gUjb6.cjs.map +0 -1
  105. package/dist/cookies-C80f8JtE.mjs +0 -24
  106. package/dist/cookies-C80f8JtE.mjs.map +0 -1
  107. package/dist/jwt-3eIuY2dg.d.cts.map +0 -1
  108. package/dist/jwt-bZR2_t8F.mjs +0 -52
  109. package/dist/jwt-bZR2_t8F.mjs.map +0 -1
  110. package/dist/jwt-clq6I6vG.cjs +0 -70
  111. package/dist/jwt-clq6I6vG.cjs.map +0 -1
  112. package/dist/jwt-kejix7rd.d.mts.map +0 -1
  113. package/dist/oidc-BYHREHir.mjs +0 -62
  114. package/dist/oidc-BYHREHir.mjs.map +0 -1
  115. package/dist/oidc-Ca7GYwmM.d.mts +0 -87
  116. package/dist/oidc-Ca7GYwmM.d.mts.map +0 -1
  117. package/dist/oidc-ChA17wLB.d.cts +0 -87
  118. package/dist/oidc-ChA17wLB.d.cts.map +0 -1
  119. package/dist/oidc-jdMfVyyC.cjs +0 -68
  120. package/dist/oidc-jdMfVyyC.cjs.map +0 -1
  121. package/dist/tokenManager-BbylTW7F.mjs +0 -66
  122. package/dist/tokenManager-BbylTW7F.mjs.map +0 -1
  123. package/dist/tokenManager-CL3yE06D.d.cts +0 -40
  124. package/dist/tokenManager-CL3yE06D.d.cts.map +0 -1
  125. package/dist/tokenManager-CosB7J0i.d.mts +0 -40
  126. package/dist/tokenManager-CosB7J0i.d.mts.map +0 -1
  127. package/dist/tokenManager-PQ-OI_NU.cjs +0 -72
  128. package/dist/tokenManager-PQ-OI_NU.cjs.map +0 -1
@@ -1,19 +1,18 @@
1
- const require_cookies = require('../cookies-Bc6gUjb6.cjs');
2
- const require_jwt = require('../jwt-clq6I6vG.cjs');
3
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_cookies = require("../cookies.cjs");
3
+ const require_jwt = require("../jwt.cjs");
4
4
  //#region src/lambda/jwt.ts
5
5
  function generatePolicy(principalId, effect, resource, context) {
6
- const policyDocument = {
7
- Version: "2012-10-17",
8
- Statement: [{
9
- Action: "execute-api:Invoke",
10
- Effect: effect,
11
- Resource: resource
12
- }]
13
- };
14
6
  return {
15
7
  principalId,
16
- policyDocument,
8
+ policyDocument: {
9
+ Version: "2012-10-17",
10
+ Statement: [{
11
+ Action: "execute-api:Invoke",
12
+ Effect: effect,
13
+ Resource: resource
14
+ }]
15
+ },
17
16
  context
18
17
  };
19
18
  }
@@ -67,8 +66,7 @@ var JwtAuthorizer = class {
67
66
  try {
68
67
  const claims = await this.verifier.verify(token);
69
68
  if (this.authorize) {
70
- const isAuthorized = await this.authorize(claims);
71
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
69
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
72
70
  }
73
71
  const principalId = this.getPrincipalId(claims);
74
72
  const context = this.getContext?.(claims);
@@ -107,8 +105,7 @@ var JwtAuthorizer = class {
107
105
  try {
108
106
  const claims = await this.verifier.verify(token);
109
107
  if (this.authorize) {
110
- const isAuthorized = await this.authorize(claims);
111
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
108
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
112
109
  }
113
110
  const principalId = this.getPrincipalId(claims);
114
111
  const context = this.getContext?.(claims);
@@ -119,7 +116,7 @@ var JwtAuthorizer = class {
119
116
  };
120
117
  }
121
118
  };
122
-
123
119
  //#endregion
124
120
  exports.JwtAuthorizer = JwtAuthorizer;
121
+
125
122
  //# sourceMappingURL=jwt.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.cjs","names":["principalId: string","effect: 'Allow' | 'Deny'","resource: string","context?: Record<string, string | number | boolean>","policyDocument: PolicyDocument","methodArn: string","options: JwtAuthorizerOptions<TClaims>","JwtVerifier","event: APIGatewayTokenAuthorizerEvent","_context: LambdaContext","event: APIGatewayRequestAuthorizerEvent"],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype JwtClaims,\n\ttype JwtConfig,\n\tJwtVerifier,\n\ttype TokenExtractionOptions,\n} from '../jwt';\n\nexport type { JwtVerifier, JwtClaims, JwtConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * JWT Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new JwtAuthorizer({\n * config: {\n * jwksUri: 'https://auth.example.com/.well-known/jwks.json',\n * issuer: 'https://auth.example.com',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * // TOKEN authorizer\n * export const tokenHandler = authorizer.tokenHandler();\n *\n * // REQUEST authorizer\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: JwtAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\t/**\n\t * Returns a TOKEN authorizer handler\n\t */\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns a REQUEST authorizer handler\n\t */\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"jwt.cjs","names":["JwtVerifier","readCookie"],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype JwtClaims,\n\ttype JwtConfig,\n\tJwtVerifier,\n\ttype TokenExtractionOptions,\n} from '../jwt';\n\nexport type { JwtVerifier, JwtClaims, JwtConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * JWT Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new JwtAuthorizer({\n * config: {\n * jwksUri: 'https://auth.example.com/.well-known/jwks.json',\n * issuer: 'https://auth.example.com',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * // TOKEN authorizer\n * export const tokenHandler = authorizer.tokenHandler();\n *\n * // REQUEST authorizer\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: JwtAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\t/**\n\t * Returns a TOKEN authorizer handler\n\t */\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns a REQUEST authorizer handler\n\t */\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAiBA,SAAS,eACR,aACA,QACA,UACA,SAC6B;CAY7B,OAAO;EACN;EACA,gBAAA;GAZA,SAAS;GACT,WAAW,CACV;IACC,QAAQ;IACR,QAAQ;IACR,UAAU;GACX,CACD;EAKa;EACb;CACD;AACD;AAEA,SAAS,oBAAoB,WAA2B;CACvD,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG;AAChC;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,gBAAb,MAAkE;CACjE;CACA;CACA;CACA;CACA;CAGA;CAEA,YAAY,SAAwC;EACnD,KAAK,WAAW,IAAIA,YAAAA,YAAY,QAAQ,MAAM;EAC9C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,mBAAmB,QAAQ,oBAAoB;EACpD,KAAK,iBAAiB,QAAQ,oBAAoB,MAAM,EAAE,OAAO;EACjE,KAAK,aAAa,QAAQ;EAC1B,KAAK,YAAY,QAAQ;CAC1B;;;;CAKA,eAAe;EACd,OAAO,OACN,OACA,aACyC;GACzC,MAAM,EAAE,oBAAoB,cAAc;GAC1C,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,mBAAmB,WAAW,SAAS,IAClD,mBAAmB,MAAM,CAAC,IAC1B;GAEH,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;;;;CAKA,iBAAiB;EAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX,KAAK;EAET,MAAM,gBACL,UACmB;GACnB,MAAM,UAAU,MAAM,WAAW,CAAC;GAClC,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,MACrC,MAAM,EAAE,YAAY,MAAM,WAAW,YAAY,CACnD;GACA,IAAI,WAAW;IACd,MAAM,cAAc,QAAQ;IAC5B,IAAI,aAAa;KAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;KAE5C,OAAO;IACR;GACD;GAEA,IAAI,YAAY;IACf,MAAM,SAASC,gBAAAA,WAAW,QAAQ,UAAU,QAAQ,QAAQ,UAAU;IACtE,IAAI,QACH,OAAO;GAET;GAEA,OAAO;EACR;EAEA,OAAO,OACN,OACA,aACyC;GACzC,MAAM,YAAY,MAAM;GACxB,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,aAAa,KAAK;GAEhC,IAAI,CAAC,OACJ,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GAGvD,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;AACD"}
@@ -1,8 +1,7 @@
1
- import { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions } from "../jwt-3eIuY2dg.cjs";
1
+ import { a as JwtVerifier, n as JwtConfig, o as TokenExtractionOptions, t as JwtClaims } from "../jwt-CoKrpeMB.cjs";
2
2
  import { APIGatewayAuthorizerResult, APIGatewayRequestAuthorizerEvent, APIGatewayTokenAuthorizerEvent, Context } from "aws-lambda";
3
-
4
3
  //#region src/lambda/jwt.d.ts
5
- interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
4
+ export interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
6
5
  config: JwtConfig;
7
6
  extraction?: TokenExtractionOptions;
8
7
  wildcardResource?: boolean;
@@ -30,7 +29,7 @@ interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
30
29
  * export const requestHandler = authorizer.requestHandler();
31
30
  * ```
32
31
  */
33
- declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
32
+ export declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
34
33
  private readonly verifier;
35
34
  private readonly extraction;
36
35
  private readonly wildcardResource;
@@ -47,7 +46,6 @@ declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
47
46
  */
48
47
  requestHandler(): (event: APIGatewayRequestAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
49
48
  }
50
- //# sourceMappingURL=jwt.d.ts.map
51
49
  //#endregion
52
- export { JwtAuthorizer, JwtAuthorizerOptions, JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
50
+ export type { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
53
51
  //# sourceMappingURL=jwt.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.cts","names":[],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":[],"mappings":";;;;UA8CiB,qCAAqC,YAAY;EAAjD,MAAA,EACR,SADQ;EAAoB,UAAA,CAAA,EAEvB,sBAFuB;EAAA,gBAAiB,CAAA,EAAA,OAAA;EAAS,cAAG,CAAA,EAAA,CAAA,MAAA,EAIvC,OAJuC,EAAA,GAAA,MAAA;EAAS,UAClE,CAAA,EAAA,CAAA,MAAA,EAKC,OALD,EAAA,GAMH,MANG,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,GAAA,SAAA;EAAS,SACJ,CAAA,EAAA,CAAA,MAAA,EAMQ,OANR,EAAA,GAAA,OAAA,GAM8B,OAN9B,CAAA,OAAA,CAAA;;;;;;AAMqC;AAuBnD;;;;;;;;;;;;;;AAgGY;cAhGC,8BAA8B,YAAY;;;;;;;uBAUjC,qBAAqB;;;;0BAcjC,0CACG,YACR,QAAQ;;;;4BAoEH,4CACG,YACR,QAAQ"}
1
+ {"version":3,"file":"jwt.d.cts","names":["LambdaContext"],"sources":["../../src/lambda/jwt.ts"],"mappings":";;;iBA8CiB,qBAAqB,gBAAgB,YAAY;EACjE,QAAQ;EACR,aAAa;EACb;EACA,kBAAkB,QAAQ;EAC1B,cACC,QAAQ,YACJ;EACL,aAAa,QAAQ,sBAAsB;;;;;;;;;;;;;;;;;;;;;;qBAuB/B,cAAc,gBAAgB,YAAY;mBACrC;mBACA;mBACA;mBACA;mBACA;mBAGA;EAEjB,YAAY,SAAS,qBAAqB;;;;EAY1C,iBAAY,OAEH,gCAA8B,UAC3BA,YACR,QAAQ;;;;EAiCZ,mBAAc,OAmCL,kCAAgC,UAC7BA,YACR,QAAQ"}
@@ -1,8 +1,7 @@
1
- import { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions } from "../jwt-kejix7rd.mjs";
1
+ import { a as JwtVerifier, n as JwtConfig, o as TokenExtractionOptions, t as JwtClaims } from "../jwt-CoKrpeMB.mjs";
2
2
  import { APIGatewayAuthorizerResult, APIGatewayRequestAuthorizerEvent, APIGatewayTokenAuthorizerEvent, Context } from "aws-lambda";
3
-
4
3
  //#region src/lambda/jwt.d.ts
5
- interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
4
+ export interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
6
5
  config: JwtConfig;
7
6
  extraction?: TokenExtractionOptions;
8
7
  wildcardResource?: boolean;
@@ -30,7 +29,7 @@ interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {
30
29
  * export const requestHandler = authorizer.requestHandler();
31
30
  * ```
32
31
  */
33
- declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
32
+ export declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
34
33
  private readonly verifier;
35
34
  private readonly extraction;
36
35
  private readonly wildcardResource;
@@ -47,7 +46,6 @@ declare class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {
47
46
  */
48
47
  requestHandler(): (event: APIGatewayRequestAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
49
48
  }
50
- //# sourceMappingURL=jwt.d.ts.map
51
49
  //#endregion
52
- export { JwtAuthorizer, JwtAuthorizerOptions, JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
50
+ export type { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
53
51
  //# sourceMappingURL=jwt.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.mts","names":[],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":[],"mappings":";;;;UA8CiB,qCAAqC,YAAY;EAAjD,MAAA,EACR,SADQ;EAAoB,UAAA,CAAA,EAEvB,sBAFuB;EAAA,gBAAiB,CAAA,EAAA,OAAA;EAAS,cAAG,CAAA,EAAA,CAAA,MAAA,EAIvC,OAJuC,EAAA,GAAA,MAAA;EAAS,UAClE,CAAA,EAAA,CAAA,MAAA,EAKC,OALD,EAAA,GAMH,MANG,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,GAAA,SAAA;EAAS,SACJ,CAAA,EAAA,CAAA,MAAA,EAMQ,OANR,EAAA,GAAA,OAAA,GAM8B,OAN9B,CAAA,OAAA,CAAA;;;;;;AAMqC;AAuBnD;;;;;;;;;;;;;;AAgGY;cAhGC,8BAA8B,YAAY;;;;;;;uBAUjC,qBAAqB;;;;0BAcjC,0CACG,YACR,QAAQ;;;;4BAoEH,4CACG,YACR,QAAQ"}
1
+ {"version":3,"file":"jwt.d.mts","names":["LambdaContext"],"sources":["../../src/lambda/jwt.ts"],"mappings":";;;iBA8CiB,qBAAqB,gBAAgB,YAAY;EACjE,QAAQ;EACR,aAAa;EACb;EACA,kBAAkB,QAAQ;EAC1B,cACC,QAAQ,YACJ;EACL,aAAa,QAAQ,sBAAsB;;;;;;;;;;;;;;;;;;;;;;qBAuB/B,cAAc,gBAAgB,YAAY;mBACrC;mBACA;mBACA;mBACA;mBACA;mBAGA;EAEjB,YAAY,SAAS,qBAAqB;;;;EAY1C,iBAAY,OAEH,gCAA8B,UAC3BA,YACR,QAAQ;;;;EAiCZ,mBAAc,OAmCL,kCAAgC,UAC7BA,YACR,QAAQ"}
@@ -1,19 +1,17 @@
1
- import { readCookie } from "../cookies-C80f8JtE.mjs";
2
- import { JwtVerifier } from "../jwt-bZR2_t8F.mjs";
3
-
1
+ import { readCookie } from "../cookies.mjs";
2
+ import { JwtVerifier } from "../jwt.mjs";
4
3
  //#region src/lambda/jwt.ts
5
4
  function generatePolicy(principalId, effect, resource, context) {
6
- const policyDocument = {
7
- Version: "2012-10-17",
8
- Statement: [{
9
- Action: "execute-api:Invoke",
10
- Effect: effect,
11
- Resource: resource
12
- }]
13
- };
14
5
  return {
15
6
  principalId,
16
- policyDocument,
7
+ policyDocument: {
8
+ Version: "2012-10-17",
9
+ Statement: [{
10
+ Action: "execute-api:Invoke",
11
+ Effect: effect,
12
+ Resource: resource
13
+ }]
14
+ },
17
15
  context
18
16
  };
19
17
  }
@@ -67,8 +65,7 @@ var JwtAuthorizer = class {
67
65
  try {
68
66
  const claims = await this.verifier.verify(token);
69
67
  if (this.authorize) {
70
- const isAuthorized = await this.authorize(claims);
71
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
68
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
72
69
  }
73
70
  const principalId = this.getPrincipalId(claims);
74
71
  const context = this.getContext?.(claims);
@@ -107,8 +104,7 @@ var JwtAuthorizer = class {
107
104
  try {
108
105
  const claims = await this.verifier.verify(token);
109
106
  if (this.authorize) {
110
- const isAuthorized = await this.authorize(claims);
111
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
107
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
112
108
  }
113
109
  const principalId = this.getPrincipalId(claims);
114
110
  const context = this.getContext?.(claims);
@@ -119,7 +115,7 @@ var JwtAuthorizer = class {
119
115
  };
120
116
  }
121
117
  };
122
-
123
118
  //#endregion
124
119
  export { JwtAuthorizer };
120
+
125
121
  //# sourceMappingURL=jwt.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.mjs","names":["principalId: string","effect: 'Allow' | 'Deny'","resource: string","context?: Record<string, string | number | boolean>","policyDocument: PolicyDocument","methodArn: string","options: JwtAuthorizerOptions<TClaims>","event: APIGatewayTokenAuthorizerEvent","_context: LambdaContext","event: APIGatewayRequestAuthorizerEvent"],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype JwtClaims,\n\ttype JwtConfig,\n\tJwtVerifier,\n\ttype TokenExtractionOptions,\n} from '../jwt';\n\nexport type { JwtVerifier, JwtClaims, JwtConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * JWT Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new JwtAuthorizer({\n * config: {\n * jwksUri: 'https://auth.example.com/.well-known/jwks.json',\n * issuer: 'https://auth.example.com',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * // TOKEN authorizer\n * export const tokenHandler = authorizer.tokenHandler();\n *\n * // REQUEST authorizer\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: JwtAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\t/**\n\t * Returns a TOKEN authorizer handler\n\t */\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns a REQUEST authorizer handler\n\t */\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"jwt.mjs","names":[],"sources":["../../src/lambda/jwt.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype JwtClaims,\n\ttype JwtConfig,\n\tJwtVerifier,\n\ttype TokenExtractionOptions,\n} from '../jwt';\n\nexport type { JwtVerifier, JwtClaims, JwtConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface JwtAuthorizerOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * JWT Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new JwtAuthorizer({\n * config: {\n * jwksUri: 'https://auth.example.com/.well-known/jwks.json',\n * issuer: 'https://auth.example.com',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * // TOKEN authorizer\n * export const tokenHandler = authorizer.tokenHandler();\n *\n * // REQUEST authorizer\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class JwtAuthorizer<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: JwtAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\t/**\n\t * Returns a TOKEN authorizer handler\n\t */\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns a REQUEST authorizer handler\n\t */\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":";;;AAiBA,SAAS,eACR,aACA,QACA,UACA,SAC6B;CAY7B,OAAO;EACN;EACA,gBAAA;GAZA,SAAS;GACT,WAAW,CACV;IACC,QAAQ;IACR,QAAQ;IACR,UAAU;GACX,CACD;EAKa;EACb;CACD;AACD;AAEA,SAAS,oBAAoB,WAA2B;CACvD,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG;AAChC;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,gBAAb,MAAkE;CACjE;CACA;CACA;CACA;CACA;CAGA;CAEA,YAAY,SAAwC;EACnD,KAAK,WAAW,IAAI,YAAY,QAAQ,MAAM;EAC9C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,mBAAmB,QAAQ,oBAAoB;EACpD,KAAK,iBAAiB,QAAQ,oBAAoB,MAAM,EAAE,OAAO;EACjE,KAAK,aAAa,QAAQ;EAC1B,KAAK,YAAY,QAAQ;CAC1B;;;;CAKA,eAAe;EACd,OAAO,OACN,OACA,aACyC;GACzC,MAAM,EAAE,oBAAoB,cAAc;GAC1C,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,mBAAmB,WAAW,SAAS,IAClD,mBAAmB,MAAM,CAAC,IAC1B;GAEH,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;;;;CAKA,iBAAiB;EAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX,KAAK;EAET,MAAM,gBACL,UACmB;GACnB,MAAM,UAAU,MAAM,WAAW,CAAC;GAClC,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,MACrC,MAAM,EAAE,YAAY,MAAM,WAAW,YAAY,CACnD;GACA,IAAI,WAAW;IACd,MAAM,cAAc,QAAQ;IAC5B,IAAI,aAAa;KAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;KAE5C,OAAO;IACR;GACD;GAEA,IAAI,YAAY;IACf,MAAM,SAAS,WAAW,QAAQ,UAAU,QAAQ,QAAQ,UAAU;IACtE,IAAI,QACH,OAAO;GAET;GAEA,OAAO;EACR;EAEA,OAAO,OACN,OACA,aACyC;GACzC,MAAM,YAAY,MAAM;GACxB,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,aAAa,KAAK;GAEhC,IAAI,CAAC,OACJ,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GAGvD,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;AACD"}
@@ -1,19 +1,18 @@
1
- const require_cookies = require('../cookies-Bc6gUjb6.cjs');
2
- const require_oidc = require('../oidc-jdMfVyyC.cjs');
3
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_cookies = require("../cookies.cjs");
3
+ const require_oidc = require("../oidc.cjs");
4
4
  //#region src/lambda/oidc.ts
5
5
  function generatePolicy(principalId, effect, resource, context) {
6
- const policyDocument = {
7
- Version: "2012-10-17",
8
- Statement: [{
9
- Action: "execute-api:Invoke",
10
- Effect: effect,
11
- Resource: resource
12
- }]
13
- };
14
6
  return {
15
7
  principalId,
16
- policyDocument,
8
+ policyDocument: {
9
+ Version: "2012-10-17",
10
+ Statement: [{
11
+ Action: "execute-api:Invoke",
12
+ Effect: effect,
13
+ Resource: resource
14
+ }]
15
+ },
17
16
  context
18
17
  };
19
18
  }
@@ -61,8 +60,7 @@ var OidcAuthorizer = class {
61
60
  try {
62
61
  const claims = await this.verifier.verify(token);
63
62
  if (this.authorize) {
64
- const isAuthorized = await this.authorize(claims);
65
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
63
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
66
64
  }
67
65
  const principalId = this.getPrincipalId(claims);
68
66
  const context = this.getContext?.(claims);
@@ -98,8 +96,7 @@ var OidcAuthorizer = class {
98
96
  try {
99
97
  const claims = await this.verifier.verify(token);
100
98
  if (this.authorize) {
101
- const isAuthorized = await this.authorize(claims);
102
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
99
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
103
100
  }
104
101
  const principalId = this.getPrincipalId(claims);
105
102
  const context = this.getContext?.(claims);
@@ -110,7 +107,7 @@ var OidcAuthorizer = class {
110
107
  };
111
108
  }
112
109
  };
113
-
114
110
  //#endregion
115
111
  exports.OidcAuthorizer = OidcAuthorizer;
112
+
116
113
  //# sourceMappingURL=oidc.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.cjs","names":["principalId: string","effect: 'Allow' | 'Deny'","resource: string","context?: Record<string, string | number | boolean>","policyDocument: PolicyDocument","methodArn: string","options: OidcAuthorizerOptions<TClaims>","OidcVerifier","event: APIGatewayTokenAuthorizerEvent","_context: LambdaContext","event: APIGatewayRequestAuthorizerEvent"],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type { OidcVerifier, OidcClaims, OidcConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface OidcAuthorizerOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * OIDC Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new OidcAuthorizer({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-api',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * export const tokenHandler = authorizer.tokenHandler();\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {\n\tprivate readonly verifier: OidcVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: OidcAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oidc.cjs","names":["OidcVerifier","readCookie"],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type { OidcVerifier, OidcClaims, OidcConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface OidcAuthorizerOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * OIDC Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new OidcAuthorizer({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-api',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * export const tokenHandler = authorizer.tokenHandler();\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {\n\tprivate readonly verifier: OidcVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: OidcAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAiBA,SAAS,eACR,aACA,QACA,UACA,SAC6B;CAY7B,OAAO;EACN;EACA,gBAAA;GAZA,SAAS;GACT,WAAW,CACV;IACC,QAAQ;IACR,QAAQ;IACR,UAAU;GACX,CACD;EAKa;EACb;CACD;AACD;AAEA,SAAS,oBAAoB,WAA2B;CACvD,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG;AAChC;;;;;;;;;;;;;;;;;;AAgCA,IAAa,iBAAb,MAAqE;CACpE;CACA;CACA;CACA;CACA;CAGA;CAEA,YAAY,SAAyC;EACpD,KAAK,WAAW,IAAIA,aAAAA,aAAa,QAAQ,MAAM;EAC/C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,mBAAmB,QAAQ,oBAAoB;EACpD,KAAK,iBAAiB,QAAQ,oBAAoB,MAAM,EAAE,OAAO;EACjE,KAAK,aAAa,QAAQ;EAC1B,KAAK,YAAY,QAAQ;CAC1B;CAEA,eAAe;EACd,OAAO,OACN,OACA,aACyC;GACzC,MAAM,EAAE,oBAAoB,cAAc;GAC1C,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,mBAAmB,WAAW,SAAS,IAClD,mBAAmB,MAAM,CAAC,IAC1B;GAEH,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;CAEA,iBAAiB;EAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX,KAAK;EAET,MAAM,gBACL,UACmB;GACnB,MAAM,UAAU,MAAM,WAAW,CAAC;GAClC,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,MACrC,MAAM,EAAE,YAAY,MAAM,WAAW,YAAY,CACnD;GACA,IAAI,WAAW;IACd,MAAM,cAAc,QAAQ;IAC5B,IAAI,aAAa;KAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;KAE5C,OAAO;IACR;GACD;GAEA,IAAI,YAAY;IACf,MAAM,SAASC,gBAAAA,WAAW,QAAQ,UAAU,QAAQ,QAAQ,UAAU;IACtE,IAAI,QACH,OAAO;GAET;GAEA,OAAO;EACR;EAEA,OAAO,OACN,OACA,aACyC;GACzC,MAAM,YAAY,MAAM;GACxB,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,aAAa,KAAK;GAEhC,IAAI,CAAC,OACJ,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GAGvD,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;AACD"}
@@ -1,9 +1,8 @@
1
- import { TokenExtractionOptions } from "../jwt-3eIuY2dg.cjs";
2
- import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc-ChA17wLB.cjs";
1
+ import { o as TokenExtractionOptions } from "../jwt-CoKrpeMB.cjs";
2
+ import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc.cjs";
3
3
  import { APIGatewayAuthorizerResult, APIGatewayRequestAuthorizerEvent, APIGatewayTokenAuthorizerEvent, Context } from "aws-lambda";
4
-
5
4
  //#region src/lambda/oidc.d.ts
6
- interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
5
+ export interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
7
6
  config: OidcConfig;
8
7
  extraction?: TokenExtractionOptions;
9
8
  wildcardResource?: boolean;
@@ -28,7 +27,7 @@ interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
28
27
  * export const requestHandler = authorizer.requestHandler();
29
28
  * ```
30
29
  */
31
- declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
30
+ export declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
32
31
  private readonly verifier;
33
32
  private readonly extraction;
34
33
  private readonly wildcardResource;
@@ -39,7 +38,6 @@ declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
39
38
  tokenHandler(): (event: APIGatewayTokenAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
40
39
  requestHandler(): (event: APIGatewayRequestAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
41
40
  }
42
- //# sourceMappingURL=oidc.d.ts.map
43
41
  //#endregion
44
- export { OidcAuthorizer, OidcAuthorizerOptions, OidcClaims, OidcConfig, OidcVerifier, TokenExtractionOptions };
42
+ export type { OidcClaims, OidcConfig, OidcVerifier, TokenExtractionOptions };
45
43
  //# sourceMappingURL=oidc.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.d.cts","names":[],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":[],"mappings":";;;;;UA8CiB,sCACA,aAAa;UAErB;EAHQ,UAAA,CAAA,EAIH,sBAJwB;EAAA,gBAAA,CAAA,EAAA,OAAA;EAAA,cACrB,CAAA,EAAA,CAAA,MAAA,EAKU,OALV,EAAA,GAAA,MAAA;EAAU,UAAG,CAAA,EAAA,CAAA,MAAA,EAOpB,OAPoB,EAAA,GAQxB,MARwB,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,GAAA,SAAA;EAAU,SAE/B,CAAA,EAAA,CAAA,MAAA,EAOa,OAPb,EAAA,GAAA,OAAA,GAOmC,OAPnC,CAAA,OAAA,CAAA;;;;;;;AAO0C;AAoBnD;;;;;;;;;;;AAyFa,cAzFA,cAyFA,CAAA,gBAzF+B,UAyF/B,GAzF4C,UAyF5C,CAAA,CAAA;EAAa,iBACb,QAAA;EAA0B,iBAAlC,UAAA;EAAO,iBAAA,gBAAA;;;;uBAhFU,sBAAsB;0BAWlC,0CACG,YACR,QAAQ;4BAiEH,4CACG,YACR,QAAQ"}
1
+ {"version":3,"file":"oidc.d.cts","names":["LambdaContext"],"sources":["../../src/lambda/oidc.ts"],"mappings":";;;;iBA8CiB,sBAChB,gBAAgB,aAAa;EAE7B,QAAQ;EACR,aAAa;EACb;EACA,kBAAkB,QAAQ;EAC1B,cACC,QAAQ,YACJ;EACL,aAAa,QAAQ,sBAAsB;;;;;;;;;;;;;;;;;;;qBAoB/B,eAAe,gBAAgB,aAAa;mBACvC;mBACA;mBACA;mBACA;mBACA;mBAGA;EAEjB,YAAY,SAAS,sBAAsB;EAS3C,iBAAY,OAEH,gCAA8B,UAC3BA,YACR,QAAQ;EA8BZ,mBAAc,OAmCL,kCAAgC,UAC7BA,YACR,QAAQ"}
@@ -1,9 +1,8 @@
1
- import { TokenExtractionOptions } from "../jwt-kejix7rd.mjs";
2
- import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc-Ca7GYwmM.mjs";
1
+ import { o as TokenExtractionOptions } from "../jwt-CoKrpeMB.mjs";
2
+ import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc.mjs";
3
3
  import { APIGatewayAuthorizerResult, APIGatewayRequestAuthorizerEvent, APIGatewayTokenAuthorizerEvent, Context } from "aws-lambda";
4
-
5
4
  //#region src/lambda/oidc.d.ts
6
- interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
5
+ export interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
7
6
  config: OidcConfig;
8
7
  extraction?: TokenExtractionOptions;
9
8
  wildcardResource?: boolean;
@@ -28,7 +27,7 @@ interface OidcAuthorizerOptions<TClaims extends OidcClaims = OidcClaims> {
28
27
  * export const requestHandler = authorizer.requestHandler();
29
28
  * ```
30
29
  */
31
- declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
30
+ export declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
32
31
  private readonly verifier;
33
32
  private readonly extraction;
34
33
  private readonly wildcardResource;
@@ -39,7 +38,6 @@ declare class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {
39
38
  tokenHandler(): (event: APIGatewayTokenAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
40
39
  requestHandler(): (event: APIGatewayRequestAuthorizerEvent, _context: Context) => Promise<APIGatewayAuthorizerResult>;
41
40
  }
42
- //# sourceMappingURL=oidc.d.ts.map
43
41
  //#endregion
44
- export { OidcAuthorizer, OidcAuthorizerOptions, OidcClaims, OidcConfig, OidcVerifier, TokenExtractionOptions };
42
+ export type { OidcClaims, OidcConfig, OidcVerifier, TokenExtractionOptions };
45
43
  //# sourceMappingURL=oidc.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.d.mts","names":[],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":[],"mappings":";;;;;UA8CiB,sCACA,aAAa;UAErB;EAHQ,UAAA,CAAA,EAIH,sBAJwB;EAAA,gBAAA,CAAA,EAAA,OAAA;EAAA,cACrB,CAAA,EAAA,CAAA,MAAA,EAKU,OALV,EAAA,GAAA,MAAA;EAAU,UAAG,CAAA,EAAA,CAAA,MAAA,EAOpB,OAPoB,EAAA,GAQxB,MARwB,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,GAAA,SAAA;EAAU,SAE/B,CAAA,EAAA,CAAA,MAAA,EAOa,OAPb,EAAA,GAAA,OAAA,GAOmC,OAPnC,CAAA,OAAA,CAAA;;;;;;;AAO0C;AAoBnD;;;;;;;;;;;AAyFa,cAzFA,cAyFA,CAAA,gBAzF+B,UAyF/B,GAzF4C,UAyF5C,CAAA,CAAA;EAAa,iBACb,QAAA;EAA0B,iBAAlC,UAAA;EAAO,iBAAA,gBAAA;;;;uBAhFU,sBAAsB;0BAWlC,0CACG,YACR,QAAQ;4BAiEH,4CACG,YACR,QAAQ"}
1
+ {"version":3,"file":"oidc.d.mts","names":["LambdaContext"],"sources":["../../src/lambda/oidc.ts"],"mappings":";;;;iBA8CiB,sBAChB,gBAAgB,aAAa;EAE7B,QAAQ;EACR,aAAa;EACb;EACA,kBAAkB,QAAQ;EAC1B,cACC,QAAQ,YACJ;EACL,aAAa,QAAQ,sBAAsB;;;;;;;;;;;;;;;;;;;qBAoB/B,eAAe,gBAAgB,aAAa;mBACvC;mBACA;mBACA;mBACA;mBACA;mBAGA;EAEjB,YAAY,SAAS,sBAAsB;EAS3C,iBAAY,OAEH,gCAA8B,UAC3BA,YACR,QAAQ;EA8BZ,mBAAc,OAmCL,kCAAgC,UAC7BA,YACR,QAAQ"}
@@ -1,19 +1,17 @@
1
- import { readCookie } from "../cookies-C80f8JtE.mjs";
2
- import { OidcVerifier } from "../oidc-BYHREHir.mjs";
3
-
1
+ import { readCookie } from "../cookies.mjs";
2
+ import { OidcVerifier } from "../oidc.mjs";
4
3
  //#region src/lambda/oidc.ts
5
4
  function generatePolicy(principalId, effect, resource, context) {
6
- const policyDocument = {
7
- Version: "2012-10-17",
8
- Statement: [{
9
- Action: "execute-api:Invoke",
10
- Effect: effect,
11
- Resource: resource
12
- }]
13
- };
14
5
  return {
15
6
  principalId,
16
- policyDocument,
7
+ policyDocument: {
8
+ Version: "2012-10-17",
9
+ Statement: [{
10
+ Action: "execute-api:Invoke",
11
+ Effect: effect,
12
+ Resource: resource
13
+ }]
14
+ },
17
15
  context
18
16
  };
19
17
  }
@@ -61,8 +59,7 @@ var OidcAuthorizer = class {
61
59
  try {
62
60
  const claims = await this.verifier.verify(token);
63
61
  if (this.authorize) {
64
- const isAuthorized = await this.authorize(claims);
65
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
62
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
66
63
  }
67
64
  const principalId = this.getPrincipalId(claims);
68
65
  const context = this.getContext?.(claims);
@@ -98,8 +95,7 @@ var OidcAuthorizer = class {
98
95
  try {
99
96
  const claims = await this.verifier.verify(token);
100
97
  if (this.authorize) {
101
- const isAuthorized = await this.authorize(claims);
102
- if (!isAuthorized) return generatePolicy("unauthorized", "Deny", resource);
98
+ if (!await this.authorize(claims)) return generatePolicy("unauthorized", "Deny", resource);
103
99
  }
104
100
  const principalId = this.getPrincipalId(claims);
105
101
  const context = this.getContext?.(claims);
@@ -110,7 +106,7 @@ var OidcAuthorizer = class {
110
106
  };
111
107
  }
112
108
  };
113
-
114
109
  //#endregion
115
110
  export { OidcAuthorizer };
111
+
116
112
  //# sourceMappingURL=oidc.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.mjs","names":["principalId: string","effect: 'Allow' | 'Deny'","resource: string","context?: Record<string, string | number | boolean>","policyDocument: PolicyDocument","methodArn: string","options: OidcAuthorizerOptions<TClaims>","event: APIGatewayTokenAuthorizerEvent","_context: LambdaContext","event: APIGatewayRequestAuthorizerEvent"],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type { OidcVerifier, OidcClaims, OidcConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface OidcAuthorizerOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * OIDC Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new OidcAuthorizer({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-api',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * export const tokenHandler = authorizer.tokenHandler();\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {\n\tprivate readonly verifier: OidcVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: OidcAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oidc.mjs","names":[],"sources":["../../src/lambda/oidc.ts"],"sourcesContent":["import type {\n\tAPIGatewayAuthorizerResult,\n\tAPIGatewayRequestAuthorizerEvent,\n\tAPIGatewayTokenAuthorizerEvent,\n\tContext as LambdaContext,\n\tPolicyDocument,\n} from 'aws-lambda';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type { OidcVerifier, OidcClaims, OidcConfig, TokenExtractionOptions };\n\nfunction generatePolicy(\n\tprincipalId: string,\n\teffect: 'Allow' | 'Deny',\n\tresource: string,\n\tcontext?: Record<string, string | number | boolean>,\n): APIGatewayAuthorizerResult {\n\tconst policyDocument: PolicyDocument = {\n\t\tVersion: '2012-10-17',\n\t\tStatement: [\n\t\t\t{\n\t\t\t\tAction: 'execute-api:Invoke',\n\t\t\t\tEffect: effect,\n\t\t\t\tResource: resource,\n\t\t\t},\n\t\t],\n\t};\n\n\treturn {\n\t\tprincipalId,\n\t\tpolicyDocument,\n\t\tcontext,\n\t};\n}\n\nfunction getWildcardResource(methodArn: string): string {\n\tconst parts = methodArn.split('/');\n\treturn `${parts[0]}/${parts[1]}/*`;\n}\n\nexport interface OidcAuthorizerOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\twildcardResource?: boolean;\n\tgetPrincipalId?: (claims: TClaims) => string;\n\tgetContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tauthorize?: (claims: TClaims) => boolean | Promise<boolean>;\n}\n\n/**\n * OIDC Lambda Authorizer\n *\n * @example\n * ```typescript\n * const authorizer = new OidcAuthorizer({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-api',\n * },\n * getContext: (claims) => ({ userId: claims.sub! }),\n * });\n *\n * export const tokenHandler = authorizer.tokenHandler();\n * export const requestHandler = authorizer.requestHandler();\n * ```\n */\nexport class OidcAuthorizer<TClaims extends OidcClaims = OidcClaims> {\n\tprivate readonly verifier: OidcVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly wildcardResource: boolean;\n\tprivate readonly getPrincipalId: (claims: TClaims) => string;\n\tprivate readonly getContext?: (\n\t\tclaims: TClaims,\n\t) => Record<string, string | number | boolean> | undefined;\n\tprivate readonly authorize?: (claims: TClaims) => boolean | Promise<boolean>;\n\n\tconstructor(options: OidcAuthorizerOptions<TClaims>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.wildcardResource = options.wildcardResource ?? true;\n\t\tthis.getPrincipalId = options.getPrincipalId ?? ((c) => c.sub ?? 'unknown');\n\t\tthis.getContext = options.getContext;\n\t\tthis.authorize = options.authorize;\n\t}\n\n\ttokenHandler() {\n\t\treturn async (\n\t\t\tevent: APIGatewayTokenAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst { authorizationToken, methodArn } = event;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = authorizationToken.startsWith('Bearer ')\n\t\t\t\t? authorizationToken.slice(7)\n\t\t\t\t: authorizationToken;\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n\n\trequestHandler() {\n\t\tconst {\n\t\t\theaderName = 'authorization',\n\t\t\tcookieName,\n\t\t\ttokenPrefix = 'Bearer ',\n\t\t} = this.extraction;\n\n\t\tconst extractToken = (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t): string | null => {\n\t\t\tconst headers = event.headers ?? {};\n\t\t\tconst headerKey = Object.keys(headers).find(\n\t\t\t\t(k) => k.toLowerCase() === headerName.toLowerCase(),\n\t\t\t);\n\t\t\tif (headerKey) {\n\t\t\t\tconst headerValue = headers[headerKey];\n\t\t\t\tif (headerValue) {\n\t\t\t\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\t\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn headerValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cookieName) {\n\t\t\t\tconst cookie = readCookie(headers.cookie ?? headers.Cookie, cookieName);\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn async (\n\t\t\tevent: APIGatewayRequestAuthorizerEvent,\n\t\t\t_context: LambdaContext,\n\t\t): Promise<APIGatewayAuthorizerResult> => {\n\t\t\tconst methodArn = event.methodArn;\n\t\t\tconst resource = this.wildcardResource\n\t\t\t\t? getWildcardResource(methodArn)\n\t\t\t\t: methodArn;\n\n\t\t\tconst token = extractToken(event);\n\n\t\t\tif (!token) {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst claims = await this.verifier.verify(token);\n\n\t\t\t\tif (this.authorize) {\n\t\t\t\t\tconst isAuthorized = await this.authorize(claims);\n\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst principalId = this.getPrincipalId(claims);\n\t\t\t\tconst context = this.getContext?.(claims);\n\n\t\t\t\treturn generatePolicy(principalId, 'Allow', resource, context);\n\t\t\t} catch {\n\t\t\t\treturn generatePolicy('unauthorized', 'Deny', resource);\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":";;;AAiBA,SAAS,eACR,aACA,QACA,UACA,SAC6B;CAY7B,OAAO;EACN;EACA,gBAAA;GAZA,SAAS;GACT,WAAW,CACV;IACC,QAAQ;IACR,QAAQ;IACR,UAAU;GACX,CACD;EAKa;EACb;CACD;AACD;AAEA,SAAS,oBAAoB,WAA2B;CACvD,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG;AAChC;;;;;;;;;;;;;;;;;;AAgCA,IAAa,iBAAb,MAAqE;CACpE;CACA;CACA;CACA;CACA;CAGA;CAEA,YAAY,SAAyC;EACpD,KAAK,WAAW,IAAI,aAAa,QAAQ,MAAM;EAC/C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,mBAAmB,QAAQ,oBAAoB;EACpD,KAAK,iBAAiB,QAAQ,oBAAoB,MAAM,EAAE,OAAO;EACjE,KAAK,aAAa,QAAQ;EAC1B,KAAK,YAAY,QAAQ;CAC1B;CAEA,eAAe;EACd,OAAO,OACN,OACA,aACyC;GACzC,MAAM,EAAE,oBAAoB,cAAc;GAC1C,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,mBAAmB,WAAW,SAAS,IAClD,mBAAmB,MAAM,CAAC,IAC1B;GAEH,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;CAEA,iBAAiB;EAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX,KAAK;EAET,MAAM,gBACL,UACmB;GACnB,MAAM,UAAU,MAAM,WAAW,CAAC;GAClC,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,MACrC,MAAM,EAAE,YAAY,MAAM,WAAW,YAAY,CACnD;GACA,IAAI,WAAW;IACd,MAAM,cAAc,QAAQ;IAC5B,IAAI,aAAa;KAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;KAE5C,OAAO;IACR;GACD;GAEA,IAAI,YAAY;IACf,MAAM,SAAS,WAAW,QAAQ,UAAU,QAAQ,QAAQ,UAAU;IACtE,IAAI,QACH,OAAO;GAET;GAEA,OAAO;EACR;EAEA,OAAO,OACN,OACA,aACyC;GACzC,MAAM,YAAY,MAAM;GACxB,MAAM,WAAW,KAAK,mBACnB,oBAAoB,SAAS,IAC7B;GAEH,MAAM,QAAQ,aAAa,KAAK;GAEhC,IAAI,CAAC,OACJ,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GAGvD,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,KAAK;IAE/C,IAAI,KAAK,WAEJ;SAAA,CAAC,MADsB,KAAK,UAAU,MAAM,GAE/C,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;IAAA;IAIxD,MAAM,cAAc,KAAK,eAAe,MAAM;IAC9C,MAAM,UAAU,KAAK,aAAa,MAAM;IAExC,OAAO,eAAe,aAAa,SAAS,UAAU,OAAO;GAC9D,QAAQ;IACP,OAAO,eAAe,gBAAgB,QAAQ,QAAQ;GACvD;EACD;CACD;AACD"}