@geekmidas/auth 10.0.0-alpha.12 → 10.0.0-alpha.14
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.
- package/dist/{cacheTokenStorage-DaqxdNxI.d.mts → cacheTokenStorage-B3u8Sf-6.d.cts} +2 -5
- package/dist/cacheTokenStorage-B3u8Sf-6.d.cts.map +1 -0
- package/dist/{cacheTokenStorage-B7sOoysu.d.cts → cacheTokenStorage-B3u8Sf-6.d.mts} +2 -5
- package/dist/cacheTokenStorage-B3u8Sf-6.d.mts.map +1 -0
- package/dist/cacheTokenStorage.cjs +30 -2
- package/dist/cacheTokenStorage.cjs.map +1 -0
- package/dist/cacheTokenStorage.d.cts +1 -1
- package/dist/cacheTokenStorage.d.mts +1 -1
- package/dist/cacheTokenStorage.mjs +29 -2
- package/dist/cacheTokenStorage.mjs.map +1 -0
- package/dist/client.cjs +144 -6
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +1 -1
- package/dist/client.d.mts +1 -1
- package/dist/client.mjs +140 -3
- package/dist/client.mjs.map +1 -0
- package/dist/cookies.cjs +24 -2
- package/dist/cookies.cjs.map +1 -0
- package/dist/cookies.d.cts +1 -3
- package/dist/cookies.d.cts.map +1 -1
- package/dist/cookies.d.mts +1 -3
- package/dist/cookies.d.mts.map +1 -1
- package/dist/cookies.mjs +23 -2
- package/dist/cookies.mjs.map +1 -0
- package/dist/hono/jwt.cjs +5 -5
- package/dist/hono/jwt.cjs.map +1 -1
- package/dist/hono/jwt.d.cts +4 -6
- package/dist/hono/jwt.d.cts.map +1 -1
- package/dist/hono/jwt.d.mts +4 -6
- package/dist/hono/jwt.d.mts.map +1 -1
- package/dist/hono/jwt.mjs +4 -5
- package/dist/hono/jwt.mjs.map +1 -1
- package/dist/hono/oidc.cjs +5 -5
- package/dist/hono/oidc.cjs.map +1 -1
- package/dist/hono/oidc.d.cts +5 -7
- package/dist/hono/oidc.d.cts.map +1 -1
- package/dist/hono/oidc.d.mts +5 -7
- package/dist/hono/oidc.d.mts.map +1 -1
- package/dist/hono/oidc.mjs +4 -5
- package/dist/hono/oidc.mjs.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +4 -5
- package/dist/{jwt-kejix7rd.d.mts → jwt-CoKrpeMB.d.cts} +2 -3
- package/dist/jwt-CoKrpeMB.d.cts.map +1 -0
- package/dist/{jwt-3eIuY2dg.d.cts → jwt-CoKrpeMB.d.mts} +2 -3
- package/dist/jwt-CoKrpeMB.d.mts.map +1 -0
- package/dist/jwt.cjs +56 -4
- package/dist/jwt.cjs.map +1 -0
- package/dist/jwt.d.cts +1 -1
- package/dist/jwt.d.mts +1 -1
- package/dist/jwt.mjs +51 -2
- package/dist/jwt.mjs.map +1 -0
- package/dist/lambda/jwt.cjs +14 -17
- package/dist/lambda/jwt.cjs.map +1 -1
- package/dist/lambda/jwt.d.cts +4 -6
- package/dist/lambda/jwt.d.cts.map +1 -1
- package/dist/lambda/jwt.d.mts +4 -6
- package/dist/lambda/jwt.d.mts.map +1 -1
- package/dist/lambda/jwt.mjs +13 -17
- package/dist/lambda/jwt.mjs.map +1 -1
- package/dist/lambda/oidc.cjs +14 -17
- package/dist/lambda/oidc.cjs.map +1 -1
- package/dist/lambda/oidc.d.cts +5 -7
- package/dist/lambda/oidc.d.cts.map +1 -1
- package/dist/lambda/oidc.d.mts +5 -7
- package/dist/lambda/oidc.d.mts.map +1 -1
- package/dist/lambda/oidc.mjs +13 -17
- package/dist/lambda/oidc.mjs.map +1 -1
- package/dist/oidc.cjs +64 -2
- package/dist/oidc.cjs.map +1 -0
- package/dist/oidc.d.cts +84 -3
- package/dist/oidc.d.cts.map +1 -0
- package/dist/oidc.d.mts +84 -3
- package/dist/oidc.d.mts.map +1 -0
- package/dist/oidc.mjs +61 -2
- package/dist/oidc.mjs.map +1 -0
- package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
- package/dist/server.cjs +4 -4
- package/dist/server.d.cts +3 -3
- package/dist/server.d.mts +3 -3
- package/dist/server.mjs +3 -4
- package/dist/tokenManager.cjs +64 -2
- package/dist/tokenManager.cjs.map +1 -0
- package/dist/tokenManager.d.cts +37 -2
- package/dist/tokenManager.d.cts.map +1 -0
- package/dist/tokenManager.d.mts +37 -2
- package/dist/tokenManager.d.mts.map +1 -0
- package/dist/tokenManager.mjs +61 -2
- package/dist/tokenManager.mjs.map +1 -0
- package/package.json +3 -3
- package/dist/cacheTokenStorage-16NE8Cd9.mjs +0 -32
- package/dist/cacheTokenStorage-16NE8Cd9.mjs.map +0 -1
- package/dist/cacheTokenStorage-B7sOoysu.d.cts.map +0 -1
- package/dist/cacheTokenStorage-CEpMniTi.cjs +0 -38
- package/dist/cacheTokenStorage-CEpMniTi.cjs.map +0 -1
- package/dist/cacheTokenStorage-DaqxdNxI.d.mts.map +0 -1
- package/dist/client-BPl_mMvb.cjs +0 -162
- package/dist/client-BPl_mMvb.cjs.map +0 -1
- package/dist/client-eidYNJSH.mjs +0 -144
- package/dist/client-eidYNJSH.mjs.map +0 -1
- package/dist/cookies-Bc6gUjb6.cjs +0 -30
- package/dist/cookies-Bc6gUjb6.cjs.map +0 -1
- package/dist/cookies-C80f8JtE.mjs +0 -24
- package/dist/cookies-C80f8JtE.mjs.map +0 -1
- package/dist/jwt-3eIuY2dg.d.cts.map +0 -1
- package/dist/jwt-bZR2_t8F.mjs +0 -52
- package/dist/jwt-bZR2_t8F.mjs.map +0 -1
- package/dist/jwt-clq6I6vG.cjs +0 -70
- package/dist/jwt-clq6I6vG.cjs.map +0 -1
- package/dist/jwt-kejix7rd.d.mts.map +0 -1
- package/dist/oidc-BYHREHir.mjs +0 -62
- package/dist/oidc-BYHREHir.mjs.map +0 -1
- package/dist/oidc-Ca7GYwmM.d.mts +0 -87
- package/dist/oidc-Ca7GYwmM.d.mts.map +0 -1
- package/dist/oidc-ChA17wLB.d.cts +0 -87
- package/dist/oidc-ChA17wLB.d.cts.map +0 -1
- package/dist/oidc-jdMfVyyC.cjs +0 -68
- package/dist/oidc-jdMfVyyC.cjs.map +0 -1
- package/dist/tokenManager-BbylTW7F.mjs +0 -66
- package/dist/tokenManager-BbylTW7F.mjs.map +0 -1
- package/dist/tokenManager-CL3yE06D.d.cts +0 -40
- package/dist/tokenManager-CL3yE06D.d.cts.map +0 -1
- package/dist/tokenManager-CosB7J0i.d.mts +0 -40
- package/dist/tokenManager-CosB7J0i.d.mts.map +0 -1
- package/dist/tokenManager-PQ-OI_NU.cjs +0 -72
- package/dist/tokenManager-PQ-OI_NU.cjs.map +0 -1
package/dist/lambda/jwt.cjs
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/lambda/jwt.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.cjs","names":["
|
|
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"}
|
package/dist/lambda/jwt.d.cts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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"],"
|
|
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;EAEL,YAAA,SAAS,qBAAqB;;;;EAY1C,iBAEE,OAAO,gCACP,UAAUA,YACR,QAAQ;;;;EAiCZ,mBAmCE,OAAO,kCACP,UAAUA,YACR,QAAQ"}
|
package/dist/lambda/jwt.d.mts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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"],"
|
|
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;EAEL,YAAA,SAAS,qBAAqB;;;;EAY1C,iBAEE,OAAO,gCACP,UAAUA,YACR,QAAQ;;;;EAiCZ,mBAmCE,OAAO,kCACP,UAAUA,YACR,QAAQ"}
|
package/dist/lambda/jwt.mjs
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import { readCookie } from "../cookies
|
|
2
|
-
import { JwtVerifier } from "../jwt
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/lambda/jwt.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.mjs","names":[
|
|
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"}
|
package/dist/lambda/oidc.cjs
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/lambda/oidc.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.cjs","names":["
|
|
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"}
|
package/dist/lambda/oidc.d.cts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { TokenExtractionOptions } from "../jwt-
|
|
2
|
-
import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc
|
|
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 {
|
|
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"],"
|
|
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;EAEL,YAAA,SAAS,sBAAsB;EAS3C,iBAEE,OAAO,gCACP,UAAUA,YACR,QAAQ;EA8BZ,mBAmCE,OAAO,kCACP,UAAUA,YACR,QAAQ"}
|
package/dist/lambda/oidc.d.mts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { TokenExtractionOptions } from "../jwt-
|
|
2
|
-
import { OidcClaims, OidcConfig, OidcVerifier } from "../oidc
|
|
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 {
|
|
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"],"
|
|
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;EAEL,YAAA,SAAS,sBAAsB;EAS3C,iBAEE,OAAO,gCACP,UAAUA,YACR,QAAQ;EA8BZ,mBAmCE,OAAO,kCACP,UAAUA,YACR,QAAQ"}
|
package/dist/lambda/oidc.mjs
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import { readCookie } from "../cookies
|
|
2
|
-
import { OidcVerifier } from "../oidc
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/lambda/oidc.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.mjs","names":[
|
|
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"}
|