@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/hono/jwt.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.cjs","names":["
|
|
1
|
+
{"version":3,"file":"jwt.cjs","names":["readCookie","JwtVerifier"],"sources":["../../src/hono/jwt.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\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 extractToken(\n\tc: Context,\n\toptions: TokenExtractionOptions = {},\n): string | null {\n\tconst {\n\t\theaderName = 'authorization',\n\t\tcookieName,\n\t\ttokenPrefix = 'Bearer ',\n\t} = options;\n\n\tconst headerValue = c.req.header(headerName);\n\tif (headerValue) {\n\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t}\n\t\treturn headerValue;\n\t}\n\n\tif (cookieName) {\n\t\tconst cookie = readCookie(c.req.header('cookie'), cookieName);\n\t\tif (cookie) {\n\t\t\treturn cookie;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\tcontextKey?: string;\n\tonError?: (c: Context, error: Error) => Response | Promise<Response>;\n\ttransformClaims?: (claims: JwtClaims) => TClaims;\n}\n\n/**\n * JWT Middleware for Hono\n *\n * @example\n * ```typescript\n * const jwt = new JwtMiddleware({\n * config: { secret: process.env.JWT_SECRET! },\n * });\n *\n * app.use('/api/*', jwt.handler());\n *\n * // Or for optional auth\n * app.use('/public/*', jwt.optional());\n * ```\n */\nexport class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly contextKey: string;\n\tprivate readonly onError?: (\n\t\tc: Context,\n\t\terror: Error,\n\t) => Response | Promise<Response>;\n\tprivate readonly transformClaims?: (claims: JwtClaims) => TClaims;\n\n\tconstructor(options: JwtMiddlewareOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.contextKey = options.contextKey ?? 'jwtClaims';\n\t\tthis.onError = options.onError;\n\t\tthis.transformClaims = options.transformClaims;\n\t}\n\n\t/**\n\t * Returns middleware that requires valid JWT\n\t */\n\thandler(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (!token) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, new Error('No token provided'));\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst payload = await this.verifier.verify(token);\n\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t? this.transformClaims(payload)\n\t\t\t\t\t: payload;\n\n\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\tc.set('jwtToken', token);\n\n\t\t\t\tawait next();\n\t\t\t} catch (error) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, error as Error);\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Invalid token' }, 401);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns middleware that allows unauthenticated requests\n\t */\n\toptional(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (token) {\n\t\t\t\tconst claims = await this.verifier.verifyOrNull(token);\n\t\t\t\tif (claims) {\n\t\t\t\t\tconst transformed = this.transformClaims\n\t\t\t\t\t\t? this.transformClaims(claims)\n\t\t\t\t\t\t: claims;\n\t\t\t\t\tc.set(this.contextKey, transformed);\n\t\t\t\t\tc.set('jwtToken', token);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait next();\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAWA,SAAS,aACR,GACA,UAAkC,CAAC,GACnB;CAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,UAAU;CAC3C,IAAI,aAAa;EAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;EAE5C,OAAO;CACR;CAEA,IAAI,YAAY;EACf,MAAM,SAASA,gBAAAA,WAAW,EAAE,IAAI,OAAO,QAAQ,GAAG,UAAU;EAC5D,IAAI,QACH,OAAO;CAET;CAEA,OAAO;AACR;;;;;;;;;;;;;;;;AAyBA,IAAa,gBAAb,MAAkE;CACjE;CACA;CACA;CACA;CAIA;CAEA,YAAY,SAAwC;EACnD,KAAK,WAAW,IAAIC,YAAAA,YAAY,QAAQ,MAAM;EAC9C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,UAAU,QAAQ;EACvB,KAAK,kBAAkB,QAAQ;CAChC;;;;CAKA,UAA6B;EAC5B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,CAAC,OAAO;IACX,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,mBAAG,IAAI,MAAM,mBAAmB,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;GAC7C;GAEA,IAAI;IACH,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,KAAK;IAChD,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,OAAO,IAC5B;IAEH,EAAE,IAAI,KAAK,YAAY,MAAM;IAC7B,EAAE,IAAI,YAAY,KAAK;IAEvB,MAAM,KAAK;GACZ,SAAS,OAAO;IACf,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,GAAG,KAAc;IAEtC,OAAO,EAAE,KAAK,EAAE,OAAO,gBAAgB,GAAG,GAAG;GAC9C;EACD;CACD;;;;CAKA,WAA8B;EAC7B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,OAAO;IACV,MAAM,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK;IACrD,IAAI,QAAQ;KACX,MAAM,cAAc,KAAK,kBACtB,KAAK,gBAAgB,MAAM,IAC3B;KACH,EAAE,IAAI,KAAK,YAAY,WAAW;KAClC,EAAE,IAAI,YAAY,KAAK;IACxB;GACD;GAEA,MAAM,KAAK;EACZ;CACD;AACD"}
|
package/dist/hono/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 { Context, MiddlewareHandler } from "hono";
|
|
3
|
-
|
|
4
3
|
//#region src/hono/jwt.d.ts
|
|
5
|
-
interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
4
|
+
export interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
6
5
|
config: JwtConfig;
|
|
7
6
|
extraction?: TokenExtractionOptions;
|
|
8
7
|
contextKey?: string;
|
|
@@ -24,7 +23,7 @@ interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
|
24
23
|
* app.use('/public/*', jwt.optional());
|
|
25
24
|
* ```
|
|
26
25
|
*/
|
|
27
|
-
declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
26
|
+
export declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
28
27
|
private readonly verifier;
|
|
29
28
|
private readonly extraction;
|
|
30
29
|
private readonly contextKey;
|
|
@@ -40,7 +39,6 @@ declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
|
40
39
|
*/
|
|
41
40
|
optional(): MiddlewareHandler;
|
|
42
41
|
}
|
|
43
|
-
//# sourceMappingURL=jwt.d.ts.map
|
|
44
42
|
//#endregion
|
|
45
|
-
export { JwtClaims, JwtConfig,
|
|
43
|
+
export type { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
|
|
46
44
|
//# sourceMappingURL=jwt.d.cts.map
|
package/dist/hono/jwt.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.cts","names":[],"sources":["../../src/hono/jwt.ts"],"
|
|
1
|
+
{"version":3,"file":"jwt.d.cts","names":[],"sources":["../../src/hono/jwt.ts"],"mappings":";;;iBAuCiB,qBAAqB,gBAAgB,YAAY;EACjE,QAAQ;EACR,aAAa;EACb;EACA,WAAW,GAAG,SAAS,OAAO,UAAU,WAAW,QAAQ;EAC3D,mBAAmB,QAAQ,cAAc;;;;;;;;;;;;;;;;;qBAkB7B,cAAc,gBAAgB,YAAY;mBACrC;mBACA;mBACA;mBACA;mBAIA;EAEL,YAAA,SAAS,qBAAqB;;;;EAW1C,WAAW;;;;EAiCX,YAAY"}
|
package/dist/hono/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 { Context, MiddlewareHandler } from "hono";
|
|
3
|
-
|
|
4
3
|
//#region src/hono/jwt.d.ts
|
|
5
|
-
interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
4
|
+
export interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
6
5
|
config: JwtConfig;
|
|
7
6
|
extraction?: TokenExtractionOptions;
|
|
8
7
|
contextKey?: string;
|
|
@@ -24,7 +23,7 @@ interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
|
|
|
24
23
|
* app.use('/public/*', jwt.optional());
|
|
25
24
|
* ```
|
|
26
25
|
*/
|
|
27
|
-
declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
26
|
+
export declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
28
27
|
private readonly verifier;
|
|
29
28
|
private readonly extraction;
|
|
30
29
|
private readonly contextKey;
|
|
@@ -40,7 +39,6 @@ declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
|
|
|
40
39
|
*/
|
|
41
40
|
optional(): MiddlewareHandler;
|
|
42
41
|
}
|
|
43
|
-
//# sourceMappingURL=jwt.d.ts.map
|
|
44
42
|
//#endregion
|
|
45
|
-
export { JwtClaims, JwtConfig,
|
|
43
|
+
export type { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions };
|
|
46
44
|
//# sourceMappingURL=jwt.d.mts.map
|
package/dist/hono/jwt.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.mts","names":[],"sources":["../../src/hono/jwt.ts"],"
|
|
1
|
+
{"version":3,"file":"jwt.d.mts","names":[],"sources":["../../src/hono/jwt.ts"],"mappings":";;;iBAuCiB,qBAAqB,gBAAgB,YAAY;EACjE,QAAQ;EACR,aAAa;EACb;EACA,WAAW,GAAG,SAAS,OAAO,UAAU,WAAW,QAAQ;EAC3D,mBAAmB,QAAQ,cAAc;;;;;;;;;;;;;;;;;qBAkB7B,cAAc,gBAAgB,YAAY;mBACrC;mBACA;mBACA;mBACA;mBAIA;EAEL,YAAA,SAAS,qBAAqB;;;;EAW1C,WAAW;;;;EAiCX,YAAY"}
|
package/dist/hono/jwt.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
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/hono/jwt.ts
|
|
5
4
|
function extractToken(c, options = {}) {
|
|
6
5
|
const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
|
|
@@ -50,7 +49,7 @@ var JwtMiddleware = class {
|
|
|
50
49
|
return async (c, next) => {
|
|
51
50
|
const token = extractToken(c, this.extraction);
|
|
52
51
|
if (!token) {
|
|
53
|
-
if (this.onError) return this.onError(c, new Error("No token provided"));
|
|
52
|
+
if (this.onError) return this.onError(c, /* @__PURE__ */ new Error("No token provided"));
|
|
54
53
|
return c.json({ error: "Unauthorized" }, 401);
|
|
55
54
|
}
|
|
56
55
|
try {
|
|
@@ -83,7 +82,7 @@ var JwtMiddleware = class {
|
|
|
83
82
|
};
|
|
84
83
|
}
|
|
85
84
|
};
|
|
86
|
-
|
|
87
85
|
//#endregion
|
|
88
86
|
export { JwtMiddleware };
|
|
87
|
+
|
|
89
88
|
//# sourceMappingURL=jwt.mjs.map
|
package/dist/hono/jwt.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.mjs","names":[
|
|
1
|
+
{"version":3,"file":"jwt.mjs","names":[],"sources":["../../src/hono/jwt.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\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 extractToken(\n\tc: Context,\n\toptions: TokenExtractionOptions = {},\n): string | null {\n\tconst {\n\t\theaderName = 'authorization',\n\t\tcookieName,\n\t\ttokenPrefix = 'Bearer ',\n\t} = options;\n\n\tconst headerValue = c.req.header(headerName);\n\tif (headerValue) {\n\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t}\n\t\treturn headerValue;\n\t}\n\n\tif (cookieName) {\n\t\tconst cookie = readCookie(c.req.header('cookie'), cookieName);\n\t\tif (cookie) {\n\t\t\treturn cookie;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {\n\tconfig: JwtConfig;\n\textraction?: TokenExtractionOptions;\n\tcontextKey?: string;\n\tonError?: (c: Context, error: Error) => Response | Promise<Response>;\n\ttransformClaims?: (claims: JwtClaims) => TClaims;\n}\n\n/**\n * JWT Middleware for Hono\n *\n * @example\n * ```typescript\n * const jwt = new JwtMiddleware({\n * config: { secret: process.env.JWT_SECRET! },\n * });\n *\n * app.use('/api/*', jwt.handler());\n *\n * // Or for optional auth\n * app.use('/public/*', jwt.optional());\n * ```\n */\nexport class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {\n\tprivate readonly verifier: JwtVerifier<TClaims>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly contextKey: string;\n\tprivate readonly onError?: (\n\t\tc: Context,\n\t\terror: Error,\n\t) => Response | Promise<Response>;\n\tprivate readonly transformClaims?: (claims: JwtClaims) => TClaims;\n\n\tconstructor(options: JwtMiddlewareOptions<TClaims>) {\n\t\tthis.verifier = new JwtVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.contextKey = options.contextKey ?? 'jwtClaims';\n\t\tthis.onError = options.onError;\n\t\tthis.transformClaims = options.transformClaims;\n\t}\n\n\t/**\n\t * Returns middleware that requires valid JWT\n\t */\n\thandler(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (!token) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, new Error('No token provided'));\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst payload = await this.verifier.verify(token);\n\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t? this.transformClaims(payload)\n\t\t\t\t\t: payload;\n\n\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\tc.set('jwtToken', token);\n\n\t\t\t\tawait next();\n\t\t\t} catch (error) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, error as Error);\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Invalid token' }, 401);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns middleware that allows unauthenticated requests\n\t */\n\toptional(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (token) {\n\t\t\t\tconst claims = await this.verifier.verifyOrNull(token);\n\t\t\t\tif (claims) {\n\t\t\t\t\tconst transformed = this.transformClaims\n\t\t\t\t\t\t? this.transformClaims(claims)\n\t\t\t\t\t\t: claims;\n\t\t\t\t\tc.set(this.contextKey, transformed);\n\t\t\t\t\tc.set('jwtToken', token);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait next();\n\t\t};\n\t}\n}\n"],"mappings":";;;AAWA,SAAS,aACR,GACA,UAAkC,CAAC,GACnB;CAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,UAAU;CAC3C,IAAI,aAAa;EAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;EAE5C,OAAO;CACR;CAEA,IAAI,YAAY;EACf,MAAM,SAAS,WAAW,EAAE,IAAI,OAAO,QAAQ,GAAG,UAAU;EAC5D,IAAI,QACH,OAAO;CAET;CAEA,OAAO;AACR;;;;;;;;;;;;;;;;AAyBA,IAAa,gBAAb,MAAkE;CACjE;CACA;CACA;CACA;CAIA;CAEA,YAAY,SAAwC;EACnD,KAAK,WAAW,IAAI,YAAY,QAAQ,MAAM;EAC9C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,UAAU,QAAQ;EACvB,KAAK,kBAAkB,QAAQ;CAChC;;;;CAKA,UAA6B;EAC5B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,CAAC,OAAO;IACX,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,mBAAG,IAAI,MAAM,mBAAmB,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;GAC7C;GAEA,IAAI;IACH,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,KAAK;IAChD,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,OAAO,IAC5B;IAEH,EAAE,IAAI,KAAK,YAAY,MAAM;IAC7B,EAAE,IAAI,YAAY,KAAK;IAEvB,MAAM,KAAK;GACZ,SAAS,OAAO;IACf,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,GAAG,KAAc;IAEtC,OAAO,EAAE,KAAK,EAAE,OAAO,gBAAgB,GAAG,GAAG;GAC9C;EACD;CACD;;;;CAKA,WAA8B;EAC7B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,OAAO;IACV,MAAM,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK;IACrD,IAAI,QAAQ;KACX,MAAM,cAAc,KAAK,kBACtB,KAAK,gBAAgB,MAAM,IAC3B;KACH,EAAE,IAAI,KAAK,YAAY,WAAW;KAClC,EAAE,IAAI,YAAY,KAAK;IACxB;GACD;GAEA,MAAM,KAAK;EACZ;CACD;AACD"}
|
package/dist/hono/oidc.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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/hono/oidc.ts
|
|
5
5
|
function extractToken(c, options = {}) {
|
|
6
6
|
const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
|
|
@@ -55,7 +55,7 @@ var OidcMiddleware = class {
|
|
|
55
55
|
return async (c, next) => {
|
|
56
56
|
const token = extractToken(c, this.extraction);
|
|
57
57
|
if (!token) {
|
|
58
|
-
if (this.onError) return this.onError(c, new Error("No token provided"));
|
|
58
|
+
if (this.onError) return this.onError(c, /* @__PURE__ */ new Error("No token provided"));
|
|
59
59
|
return c.json({ error: "Unauthorized" }, 401);
|
|
60
60
|
}
|
|
61
61
|
try {
|
|
@@ -95,7 +95,7 @@ var OidcMiddleware = class {
|
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
|
-
|
|
99
98
|
//#endregion
|
|
100
99
|
exports.OidcMiddleware = OidcMiddleware;
|
|
100
|
+
|
|
101
101
|
//# sourceMappingURL=oidc.cjs.map
|
package/dist/hono/oidc.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.cjs","names":["
|
|
1
|
+
{"version":3,"file":"oidc.cjs","names":["readCookie","OidcVerifier"],"sources":["../../src/hono/oidc.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\ttype OidcUserInfo,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type {\n\tOidcVerifier,\n\tOidcClaims,\n\tOidcConfig,\n\tOidcUserInfo,\n\tTokenExtractionOptions,\n};\n\nfunction extractToken(\n\tc: Context,\n\toptions: TokenExtractionOptions = {},\n): string | null {\n\tconst {\n\t\theaderName = 'authorization',\n\t\tcookieName,\n\t\ttokenPrefix = 'Bearer ',\n\t} = options;\n\n\tconst headerValue = c.req.header(headerName);\n\tif (headerValue) {\n\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t}\n\t\treturn headerValue;\n\t}\n\n\tif (cookieName) {\n\t\tconst cookie = readCookie(c.req.header('cookie'), cookieName);\n\t\tif (cookie) {\n\t\t\treturn cookie;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport interface OidcMiddlewareOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n\tTUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\tcontextKey?: string;\n\tfetchUserInfo?: boolean;\n\tonError?: (c: Context, error: Error) => Response | Promise<Response>;\n\ttransformClaims?: (claims: OidcClaims, userInfo?: TUserInfo) => TClaims;\n}\n\n/**\n * OIDC Middleware for Hono\n *\n * @example\n * ```typescript\n * const oidc = new OidcMiddleware({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-client-id',\n * },\n * });\n *\n * app.use('/api/*', oidc.handler());\n *\n * // With user info\n * const oidcWithUserInfo = new OidcMiddleware({\n * config: { issuer: '...', audience: '...' },\n * fetchUserInfo: true,\n * });\n * ```\n */\nexport class OidcMiddleware<\n\tTClaims extends OidcClaims = OidcClaims,\n\tTUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n\tprivate readonly verifier: OidcVerifier<TClaims, TUserInfo>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly contextKey: string;\n\tprivate readonly fetchUserInfo: boolean;\n\tprivate readonly onError?: (\n\t\tc: Context,\n\t\terror: Error,\n\t) => Response | Promise<Response>;\n\tprivate readonly transformClaims?: (\n\t\tclaims: OidcClaims,\n\t\tuserInfo?: TUserInfo,\n\t) => TClaims;\n\n\tconstructor(options: OidcMiddlewareOptions<TClaims, TUserInfo>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.contextKey = options.contextKey ?? 'oidcClaims';\n\t\tthis.fetchUserInfo = options.fetchUserInfo ?? false;\n\t\tthis.onError = options.onError;\n\t\tthis.transformClaims = options.transformClaims;\n\t}\n\n\thandler(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (!token) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, new Error('No token provided'));\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst payload = await this.verifier.verify(token);\n\n\t\t\t\tlet userInfo: TUserInfo | undefined;\n\t\t\t\tif (this.fetchUserInfo) {\n\t\t\t\t\tuserInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n\t\t\t\t\tc.set('oidcUserInfo', userInfo);\n\t\t\t\t}\n\n\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t? this.transformClaims(payload, userInfo)\n\t\t\t\t\t: payload;\n\n\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\tc.set('oidcToken', token);\n\n\t\t\t\tawait next();\n\t\t\t} catch (error) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, error as Error);\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Invalid token' }, 401);\n\t\t\t}\n\t\t};\n\t}\n\n\toptional(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (token) {\n\t\t\t\tconst payload = await this.verifier.verifyOrNull(token);\n\t\t\t\tif (payload) {\n\t\t\t\t\tlet userInfo: TUserInfo | undefined;\n\t\t\t\t\tif (this.fetchUserInfo) {\n\t\t\t\t\t\tuserInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n\t\t\t\t\t\tc.set('oidcUserInfo', userInfo);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t\t? this.transformClaims(payload, userInfo)\n\t\t\t\t\t\t: payload;\n\n\t\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\t\tc.set('oidcToken', token);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait next();\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAkBA,SAAS,aACR,GACA,UAAkC,CAAC,GACnB;CAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,UAAU;CAC3C,IAAI,aAAa;EAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;EAE5C,OAAO;CACR;CAEA,IAAI,YAAY;EACf,MAAM,SAASA,gBAAAA,WAAW,EAAE,IAAI,OAAO,QAAQ,GAAG,UAAU;EAC5D,IAAI,QACH,OAAO;CAET;CAEA,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,iBAAb,MAGE;CACD;CACA;CACA;CACA;CACA;CAIA;CAKA,YAAY,SAAoD;EAC/D,KAAK,WAAW,IAAIC,aAAAA,aAAa,QAAQ,MAAM;EAC/C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,gBAAgB,QAAQ,iBAAiB;EAC9C,KAAK,UAAU,QAAQ;EACvB,KAAK,kBAAkB,QAAQ;CAChC;CAEA,UAA6B;EAC5B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,CAAC,OAAO;IACX,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,mBAAG,IAAI,MAAM,mBAAmB,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;GAC7C;GAEA,IAAI;IACH,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,KAAK;IAEhD,IAAI;IACJ,IAAI,KAAK,eAAe;KACvB,WAAY,MAAM,KAAK,SAAS,cAAc,KAAK,KAAM,KAAA;KACzD,EAAE,IAAI,gBAAgB,QAAQ;IAC/B;IAEA,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,SAAS,QAAQ,IACtC;IAEH,EAAE,IAAI,KAAK,YAAY,MAAM;IAC7B,EAAE,IAAI,aAAa,KAAK;IAExB,MAAM,KAAK;GACZ,SAAS,OAAO;IACf,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,GAAG,KAAc;IAEtC,OAAO,EAAE,KAAK,EAAE,OAAO,gBAAgB,GAAG,GAAG;GAC9C;EACD;CACD;CAEA,WAA8B;EAC7B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,OAAO;IACV,MAAM,UAAU,MAAM,KAAK,SAAS,aAAa,KAAK;IACtD,IAAI,SAAS;KACZ,IAAI;KACJ,IAAI,KAAK,eAAe;MACvB,WAAY,MAAM,KAAK,SAAS,cAAc,KAAK,KAAM,KAAA;MACzD,EAAE,IAAI,gBAAgB,QAAQ;KAC/B;KAEA,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,SAAS,QAAQ,IACtC;KAEH,EAAE,IAAI,KAAK,YAAY,MAAM;KAC7B,EAAE,IAAI,aAAa,KAAK;IACzB;GACD;GAEA,MAAM,KAAK;EACZ;CACD;AACD"}
|
package/dist/hono/oidc.d.cts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { TokenExtractionOptions } from "../jwt-
|
|
2
|
-
import { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier } from "../oidc
|
|
1
|
+
import { o as TokenExtractionOptions } from "../jwt-CoKrpeMB.cjs";
|
|
2
|
+
import { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier } from "../oidc.cjs";
|
|
3
3
|
import { Context, MiddlewareHandler } from "hono";
|
|
4
|
-
|
|
5
4
|
//#region src/hono/oidc.d.ts
|
|
6
|
-
interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
5
|
+
export interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
7
6
|
config: OidcConfig;
|
|
8
7
|
extraction?: TokenExtractionOptions;
|
|
9
8
|
contextKey?: string;
|
|
@@ -32,7 +31,7 @@ interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserIn
|
|
|
32
31
|
* });
|
|
33
32
|
* ```
|
|
34
33
|
*/
|
|
35
|
-
declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
34
|
+
export declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
36
35
|
private readonly verifier;
|
|
37
36
|
private readonly extraction;
|
|
38
37
|
private readonly contextKey;
|
|
@@ -43,7 +42,6 @@ declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo
|
|
|
43
42
|
handler(): MiddlewareHandler;
|
|
44
43
|
optional(): MiddlewareHandler;
|
|
45
44
|
}
|
|
46
|
-
//# sourceMappingURL=oidc.d.ts.map
|
|
47
45
|
//#endregion
|
|
48
|
-
export { OidcClaims, OidcConfig,
|
|
46
|
+
export type { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier, TokenExtractionOptions };
|
|
49
47
|
//# sourceMappingURL=oidc.d.cts.map
|
package/dist/hono/oidc.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.d.cts","names":[],"sources":["../../src/hono/oidc.ts"],"
|
|
1
|
+
{"version":3,"file":"oidc.d.cts","names":[],"sources":["../../src/hono/oidc.ts"],"mappings":";;;;iBA8CiB,sBAChB,gBAAgB,aAAa,YAC7B,kBAAkB,eAAe;EAEjC,QAAQ;EACR,aAAa;EACb;EACA;EACA,WAAW,GAAG,SAAS,OAAO,UAAU,WAAW,QAAQ;EAC3D,mBAAmB,QAAQ,YAAY,WAAW,cAAc;;;;;;;;;;;;;;;;;;;;;;;qBAwBpD,eACZ,gBAAgB,aAAa,YAC7B,kBAAkB,eAAe;mBAEhB;mBACA;mBACA;mBACA;mBACA;mBAIA;EAKL,YAAA,SAAS,sBAAsB,SAAS;EASpD,WAAW;EAqCX,YAAY"}
|
package/dist/hono/oidc.d.mts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { TokenExtractionOptions } from "../jwt-
|
|
2
|
-
import { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier } from "../oidc
|
|
1
|
+
import { o as TokenExtractionOptions } from "../jwt-CoKrpeMB.mjs";
|
|
2
|
+
import { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier } from "../oidc.mjs";
|
|
3
3
|
import { Context, MiddlewareHandler } from "hono";
|
|
4
|
-
|
|
5
4
|
//#region src/hono/oidc.d.ts
|
|
6
|
-
interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
5
|
+
export interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
7
6
|
config: OidcConfig;
|
|
8
7
|
extraction?: TokenExtractionOptions;
|
|
9
8
|
contextKey?: string;
|
|
@@ -32,7 +31,7 @@ interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserIn
|
|
|
32
31
|
* });
|
|
33
32
|
* ```
|
|
34
33
|
*/
|
|
35
|
-
declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
34
|
+
export declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
|
|
36
35
|
private readonly verifier;
|
|
37
36
|
private readonly extraction;
|
|
38
37
|
private readonly contextKey;
|
|
@@ -43,7 +42,6 @@ declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo
|
|
|
43
42
|
handler(): MiddlewareHandler;
|
|
44
43
|
optional(): MiddlewareHandler;
|
|
45
44
|
}
|
|
46
|
-
//# sourceMappingURL=oidc.d.ts.map
|
|
47
45
|
//#endregion
|
|
48
|
-
export { OidcClaims, OidcConfig,
|
|
46
|
+
export type { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier, TokenExtractionOptions };
|
|
49
47
|
//# sourceMappingURL=oidc.d.mts.map
|
package/dist/hono/oidc.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.d.mts","names":[],"sources":["../../src/hono/oidc.ts"],"
|
|
1
|
+
{"version":3,"file":"oidc.d.mts","names":[],"sources":["../../src/hono/oidc.ts"],"mappings":";;;;iBA8CiB,sBAChB,gBAAgB,aAAa,YAC7B,kBAAkB,eAAe;EAEjC,QAAQ;EACR,aAAa;EACb;EACA;EACA,WAAW,GAAG,SAAS,OAAO,UAAU,WAAW,QAAQ;EAC3D,mBAAmB,QAAQ,YAAY,WAAW,cAAc;;;;;;;;;;;;;;;;;;;;;;;qBAwBpD,eACZ,gBAAgB,aAAa,YAC7B,kBAAkB,eAAe;mBAEhB;mBACA;mBACA;mBACA;mBACA;mBAIA;EAKL,YAAA,SAAS,sBAAsB,SAAS;EASpD,WAAW;EAqCX,YAAY"}
|
package/dist/hono/oidc.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
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/hono/oidc.ts
|
|
5
4
|
function extractToken(c, options = {}) {
|
|
6
5
|
const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
|
|
@@ -55,7 +54,7 @@ var OidcMiddleware = class {
|
|
|
55
54
|
return async (c, next) => {
|
|
56
55
|
const token = extractToken(c, this.extraction);
|
|
57
56
|
if (!token) {
|
|
58
|
-
if (this.onError) return this.onError(c, new Error("No token provided"));
|
|
57
|
+
if (this.onError) return this.onError(c, /* @__PURE__ */ new Error("No token provided"));
|
|
59
58
|
return c.json({ error: "Unauthorized" }, 401);
|
|
60
59
|
}
|
|
61
60
|
try {
|
|
@@ -95,7 +94,7 @@ var OidcMiddleware = class {
|
|
|
95
94
|
};
|
|
96
95
|
}
|
|
97
96
|
};
|
|
98
|
-
|
|
99
97
|
//#endregion
|
|
100
98
|
export { OidcMiddleware };
|
|
99
|
+
|
|
101
100
|
//# sourceMappingURL=oidc.mjs.map
|
package/dist/hono/oidc.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.mjs","names":[
|
|
1
|
+
{"version":3,"file":"oidc.mjs","names":[],"sources":["../../src/hono/oidc.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { readCookie } from '../cookies';\nimport {\n\ttype OidcClaims,\n\ttype OidcConfig,\n\ttype OidcUserInfo,\n\tOidcVerifier,\n\ttype TokenExtractionOptions,\n} from '../oidc';\n\nexport type {\n\tOidcVerifier,\n\tOidcClaims,\n\tOidcConfig,\n\tOidcUserInfo,\n\tTokenExtractionOptions,\n};\n\nfunction extractToken(\n\tc: Context,\n\toptions: TokenExtractionOptions = {},\n): string | null {\n\tconst {\n\t\theaderName = 'authorization',\n\t\tcookieName,\n\t\ttokenPrefix = 'Bearer ',\n\t} = options;\n\n\tconst headerValue = c.req.header(headerName);\n\tif (headerValue) {\n\t\tif (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n\t\t\treturn headerValue.slice(tokenPrefix.length);\n\t\t}\n\t\treturn headerValue;\n\t}\n\n\tif (cookieName) {\n\t\tconst cookie = readCookie(c.req.header('cookie'), cookieName);\n\t\tif (cookie) {\n\t\t\treturn cookie;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport interface OidcMiddlewareOptions<\n\tTClaims extends OidcClaims = OidcClaims,\n\tTUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n\tconfig: OidcConfig;\n\textraction?: TokenExtractionOptions;\n\tcontextKey?: string;\n\tfetchUserInfo?: boolean;\n\tonError?: (c: Context, error: Error) => Response | Promise<Response>;\n\ttransformClaims?: (claims: OidcClaims, userInfo?: TUserInfo) => TClaims;\n}\n\n/**\n * OIDC Middleware for Hono\n *\n * @example\n * ```typescript\n * const oidc = new OidcMiddleware({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-client-id',\n * },\n * });\n *\n * app.use('/api/*', oidc.handler());\n *\n * // With user info\n * const oidcWithUserInfo = new OidcMiddleware({\n * config: { issuer: '...', audience: '...' },\n * fetchUserInfo: true,\n * });\n * ```\n */\nexport class OidcMiddleware<\n\tTClaims extends OidcClaims = OidcClaims,\n\tTUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n\tprivate readonly verifier: OidcVerifier<TClaims, TUserInfo>;\n\tprivate readonly extraction: TokenExtractionOptions;\n\tprivate readonly contextKey: string;\n\tprivate readonly fetchUserInfo: boolean;\n\tprivate readonly onError?: (\n\t\tc: Context,\n\t\terror: Error,\n\t) => Response | Promise<Response>;\n\tprivate readonly transformClaims?: (\n\t\tclaims: OidcClaims,\n\t\tuserInfo?: TUserInfo,\n\t) => TClaims;\n\n\tconstructor(options: OidcMiddlewareOptions<TClaims, TUserInfo>) {\n\t\tthis.verifier = new OidcVerifier(options.config);\n\t\tthis.extraction = options.extraction ?? {};\n\t\tthis.contextKey = options.contextKey ?? 'oidcClaims';\n\t\tthis.fetchUserInfo = options.fetchUserInfo ?? false;\n\t\tthis.onError = options.onError;\n\t\tthis.transformClaims = options.transformClaims;\n\t}\n\n\thandler(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (!token) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, new Error('No token provided'));\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst payload = await this.verifier.verify(token);\n\n\t\t\t\tlet userInfo: TUserInfo | undefined;\n\t\t\t\tif (this.fetchUserInfo) {\n\t\t\t\t\tuserInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n\t\t\t\t\tc.set('oidcUserInfo', userInfo);\n\t\t\t\t}\n\n\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t? this.transformClaims(payload, userInfo)\n\t\t\t\t\t: payload;\n\n\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\tc.set('oidcToken', token);\n\n\t\t\t\tawait next();\n\t\t\t} catch (error) {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\treturn this.onError(c, error as Error);\n\t\t\t\t}\n\t\t\t\treturn c.json({ error: 'Invalid token' }, 401);\n\t\t\t}\n\t\t};\n\t}\n\n\toptional(): MiddlewareHandler {\n\t\treturn async (c: Context, next: Next) => {\n\t\t\tconst token = extractToken(c, this.extraction);\n\n\t\t\tif (token) {\n\t\t\t\tconst payload = await this.verifier.verifyOrNull(token);\n\t\t\t\tif (payload) {\n\t\t\t\t\tlet userInfo: TUserInfo | undefined;\n\t\t\t\t\tif (this.fetchUserInfo) {\n\t\t\t\t\t\tuserInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n\t\t\t\t\t\tc.set('oidcUserInfo', userInfo);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst claims = this.transformClaims\n\t\t\t\t\t\t? this.transformClaims(payload, userInfo)\n\t\t\t\t\t\t: payload;\n\n\t\t\t\t\tc.set(this.contextKey, claims);\n\t\t\t\t\tc.set('oidcToken', token);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait next();\n\t\t};\n\t}\n}\n"],"mappings":";;;AAkBA,SAAS,aACR,GACA,UAAkC,CAAC,GACnB;CAChB,MAAM,EACL,aAAa,iBACb,YACA,cAAc,cACX;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,UAAU;CAC3C,IAAI,aAAa;EAChB,IAAI,eAAe,YAAY,WAAW,WAAW,GACpD,OAAO,YAAY,MAAM,YAAY,MAAM;EAE5C,OAAO;CACR;CAEA,IAAI,YAAY;EACf,MAAM,SAAS,WAAW,EAAE,IAAI,OAAO,QAAQ,GAAG,UAAU;EAC5D,IAAI,QACH,OAAO;CAET;CAEA,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,iBAAb,MAGE;CACD;CACA;CACA;CACA;CACA;CAIA;CAKA,YAAY,SAAoD;EAC/D,KAAK,WAAW,IAAI,aAAa,QAAQ,MAAM;EAC/C,KAAK,aAAa,QAAQ,cAAc,CAAC;EACzC,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,gBAAgB,QAAQ,iBAAiB;EAC9C,KAAK,UAAU,QAAQ;EACvB,KAAK,kBAAkB,QAAQ;CAChC;CAEA,UAA6B;EAC5B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,CAAC,OAAO;IACX,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,mBAAG,IAAI,MAAM,mBAAmB,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;GAC7C;GAEA,IAAI;IACH,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,KAAK;IAEhD,IAAI;IACJ,IAAI,KAAK,eAAe;KACvB,WAAY,MAAM,KAAK,SAAS,cAAc,KAAK,KAAM,KAAA;KACzD,EAAE,IAAI,gBAAgB,QAAQ;IAC/B;IAEA,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,SAAS,QAAQ,IACtC;IAEH,EAAE,IAAI,KAAK,YAAY,MAAM;IAC7B,EAAE,IAAI,aAAa,KAAK;IAExB,MAAM,KAAK;GACZ,SAAS,OAAO;IACf,IAAI,KAAK,SACR,OAAO,KAAK,QAAQ,GAAG,KAAc;IAEtC,OAAO,EAAE,KAAK,EAAE,OAAO,gBAAgB,GAAG,GAAG;GAC9C;EACD;CACD;CAEA,WAA8B;EAC7B,OAAO,OAAO,GAAY,SAAe;GACxC,MAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;GAE7C,IAAI,OAAO;IACV,MAAM,UAAU,MAAM,KAAK,SAAS,aAAa,KAAK;IACtD,IAAI,SAAS;KACZ,IAAI;KACJ,IAAI,KAAK,eAAe;MACvB,WAAY,MAAM,KAAK,SAAS,cAAc,KAAK,KAAM,KAAA;MACzD,EAAE,IAAI,gBAAgB,QAAQ;KAC/B;KAEA,MAAM,SAAS,KAAK,kBACjB,KAAK,gBAAgB,SAAS,QAAQ,IACtC;KAEH,EAAE,IAAI,KAAK,YAAY,MAAM;KAC7B,EAAE,IAAI,aAAa,KAAK;IACzB;GACD;GAEA,MAAM,KAAK;EACZ;CACD;AACD"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_cacheTokenStorage = require("./cacheTokenStorage.cjs");
|
|
3
|
+
const require_client = require("./client.cjs");
|
|
4
|
+
const require_tokenManager = require("./tokenManager.cjs");
|
|
5
5
|
exports.CacheTokenStorage = require_cacheTokenStorage.CacheTokenStorage;
|
|
6
6
|
exports.LocalStorageTokenStorage = require_client.LocalStorageTokenStorage;
|
|
7
7
|
exports.MemoryTokenStorage = require_client.MemoryTokenStorage;
|
|
8
8
|
exports.TokenClient = require_client.TokenClient;
|
|
9
|
-
exports.TokenManager = require_tokenManager.TokenManager;
|
|
9
|
+
exports.TokenManager = require_tokenManager.TokenManager;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DecodedToken, TokenManager, TokenManagerOptions, TokenPair, TokenPayload } from "./tokenManager
|
|
1
|
+
import { a as TokenClientOptions, i as TokenClient, n as LocalStorageTokenStorage, o as TokenStorage, r as MemoryTokenStorage, t as CacheTokenStorage } from "./cacheTokenStorage-B3u8Sf-6.cjs";
|
|
2
|
+
import { DecodedToken, TokenManager, TokenManagerOptions, TokenPair, TokenPayload } from "./tokenManager.cjs";
|
|
3
3
|
export { CacheTokenStorage, DecodedToken, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenManager, TokenManagerOptions, TokenPair, TokenPayload, TokenStorage };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DecodedToken, TokenManager, TokenManagerOptions, TokenPair, TokenPayload } from "./tokenManager
|
|
1
|
+
import { a as TokenClientOptions, i as TokenClient, n as LocalStorageTokenStorage, o as TokenStorage, r as MemoryTokenStorage, t as CacheTokenStorage } from "./cacheTokenStorage-B3u8Sf-6.mjs";
|
|
2
|
+
import { DecodedToken, TokenManager, TokenManagerOptions, TokenPair, TokenPayload } from "./tokenManager.mjs";
|
|
3
3
|
export { CacheTokenStorage, DecodedToken, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenManager, TokenManagerOptions, TokenPair, TokenPayload, TokenStorage };
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { CacheTokenStorage } from "./cacheTokenStorage
|
|
2
|
-
import { LocalStorageTokenStorage, MemoryTokenStorage, TokenClient } from "./client
|
|
3
|
-
import { TokenManager } from "./tokenManager
|
|
4
|
-
|
|
5
|
-
export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenManager };
|
|
1
|
+
import { CacheTokenStorage } from "./cacheTokenStorage.mjs";
|
|
2
|
+
import { LocalStorageTokenStorage, MemoryTokenStorage, TokenClient } from "./client.mjs";
|
|
3
|
+
import { TokenManager } from "./tokenManager.mjs";
|
|
4
|
+
export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenManager };
|
|
@@ -56,7 +56,6 @@ declare class JwtVerifier<TClaims extends JwtClaims = JwtClaims> {
|
|
|
56
56
|
* WARNING: This does NOT verify the token signature!
|
|
57
57
|
*/
|
|
58
58
|
declare function decodeJwt<TClaims extends JwtClaims = JwtClaims>(token: string): TClaims;
|
|
59
|
-
//# sourceMappingURL=jwt.d.ts.map
|
|
60
59
|
//#endregion
|
|
61
|
-
export {
|
|
62
|
-
//# sourceMappingURL=jwt-
|
|
60
|
+
export { JwtVerifier as a, isJwksConfig as c, JwtSecretConfig as i, JwtConfig as n, TokenExtractionOptions as o, JwtJwksConfig as r, decodeJwt as s, JwtClaims as t };
|
|
61
|
+
//# sourceMappingURL=jwt-CoKrpeMB.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-CoKrpeMB.d.cts","names":[],"sources":["../src/jwt.ts"],"mappings":";;;;UAKiB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;;;;UAMgB;EAChB;EACA;EACA;EACA;;;;;UAMgB;EAChB;EACA;EACA;EACA;;KAGW,YAAY,kBAAkB;;;;UAKzB;EAChB;EACA;EACA;;iBAGe,aAAa,QAAQ,YAAY,UAAU;;;;cAO9C,YAAY,gBAAgB,YAAY;mBAIvB;UAHrB;mBACS;EAEY,YAAA,QAAQ;EAS/B,OAAO,gBAAgB,QAAQ;EAkB/B,aAAa,gBAAgB,QAAQ;EAQ3C;;;;;;iBASe,UAAU,gBAAgB,YAAY,WACrD,gBACE"}
|
|
@@ -56,7 +56,6 @@ declare class JwtVerifier<TClaims extends JwtClaims = JwtClaims> {
|
|
|
56
56
|
* WARNING: This does NOT verify the token signature!
|
|
57
57
|
*/
|
|
58
58
|
declare function decodeJwt<TClaims extends JwtClaims = JwtClaims>(token: string): TClaims;
|
|
59
|
-
//# sourceMappingURL=jwt.d.ts.map
|
|
60
59
|
//#endregion
|
|
61
|
-
export {
|
|
62
|
-
//# sourceMappingURL=jwt-
|
|
60
|
+
export { JwtVerifier as a, isJwksConfig as c, JwtSecretConfig as i, JwtConfig as n, TokenExtractionOptions as o, JwtJwksConfig as r, decodeJwt as s, JwtClaims as t };
|
|
61
|
+
//# sourceMappingURL=jwt-CoKrpeMB.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-CoKrpeMB.d.mts","names":[],"sources":["../src/jwt.ts"],"mappings":";;;;UAKiB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;;;;UAMgB;EAChB;EACA;EACA;EACA;;;;;UAMgB;EAChB;EACA;EACA;EACA;;KAGW,YAAY,kBAAkB;;;;UAKzB;EAChB;EACA;EACA;;iBAGe,aAAa,QAAQ,YAAY,UAAU;;;;cAO9C,YAAY,gBAAgB,YAAY;mBAIvB;UAHrB;mBACS;EAEY,YAAA,QAAQ;EAS/B,OAAO,gBAAgB,QAAQ;EAkB/B,aAAa,gBAAgB,QAAQ;EAQ3C;;;;;;iBASe,UAAU,gBAAgB,YAAY,WACrD,gBACE"}
|
package/dist/jwt.cjs
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
|
|
3
|
+
let jose = require("jose");
|
|
4
|
+
jose = require_rolldown_runtime.__toESM(jose, 1);
|
|
5
|
+
//#region src/jwt.ts
|
|
6
|
+
function isJwksConfig(config) {
|
|
7
|
+
return "jwksUri" in config;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* JWT Verifier with JWKS caching
|
|
11
|
+
*/
|
|
12
|
+
var JwtVerifier = class {
|
|
13
|
+
config;
|
|
14
|
+
jwks = null;
|
|
15
|
+
verifyOptions;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.verifyOptions = {
|
|
19
|
+
issuer: config.issuer,
|
|
20
|
+
audience: config.audience,
|
|
21
|
+
algorithms: config.algorithms ?? (isJwksConfig(config) ? void 0 : ["HS256"])
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async verify(token) {
|
|
25
|
+
if (isJwksConfig(this.config)) {
|
|
26
|
+
if (!this.jwks) this.jwks = jose.createRemoteJWKSet(new URL(this.config.jwksUri));
|
|
27
|
+
const { payload } = await jose.jwtVerify(token, this.jwks, this.verifyOptions);
|
|
28
|
+
return payload;
|
|
29
|
+
}
|
|
30
|
+
const secret = new TextEncoder().encode(this.config.secret);
|
|
31
|
+
const { payload } = await jose.jwtVerify(token, secret, this.verifyOptions);
|
|
32
|
+
return payload;
|
|
33
|
+
}
|
|
34
|
+
async verifyOrNull(token) {
|
|
35
|
+
try {
|
|
36
|
+
return await this.verify(token);
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
clearCache() {
|
|
42
|
+
this.jwks = null;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Decode a JWT without verification
|
|
47
|
+
* WARNING: This does NOT verify the token signature!
|
|
48
|
+
*/
|
|
49
|
+
function decodeJwt(token) {
|
|
50
|
+
return jose.decodeJwt(token);
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
exports.JwtVerifier = JwtVerifier;
|
|
54
|
+
exports.decodeJwt = decodeJwt;
|
|
55
|
+
exports.isJwksConfig = isJwksConfig;
|
|
2
56
|
|
|
3
|
-
|
|
4
|
-
exports.decodeJwt = require_jwt.decodeJwt;
|
|
5
|
-
exports.isJwksConfig = require_jwt.isJwksConfig;
|
|
57
|
+
//# sourceMappingURL=jwt.cjs.map
|
package/dist/jwt.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.cjs","names":[],"sources":["../src/jwt.ts"],"sourcesContent":["import * as jose from 'jose';\n\n/**\n * Standard JWT claims\n */\nexport interface JwtClaims {\n\tsub?: string;\n\tiss?: string;\n\taud?: string | string[];\n\texp?: number;\n\tiat?: number;\n\tnbf?: number;\n\tjti?: string;\n}\n\n/**\n * Configuration for JWT verification with a symmetric secret\n */\nexport interface JwtSecretConfig {\n\tsecret: string;\n\tissuer?: string;\n\taudience?: string | string[];\n\talgorithms?: string[];\n}\n\n/**\n * Configuration for JWT verification with JWKS\n */\nexport interface JwtJwksConfig {\n\tjwksUri: string;\n\tissuer?: string;\n\taudience?: string | string[];\n\talgorithms?: string[];\n}\n\nexport type JwtConfig = JwtSecretConfig | JwtJwksConfig;\n\n/**\n * Options for token extraction from requests\n */\nexport interface TokenExtractionOptions {\n\theaderName?: string;\n\tcookieName?: string;\n\ttokenPrefix?: string;\n}\n\nexport function isJwksConfig(config: JwtConfig): config is JwtJwksConfig {\n\treturn 'jwksUri' in config;\n}\n\n/**\n * JWT Verifier with JWKS caching\n */\nexport class JwtVerifier<TClaims extends JwtClaims = JwtClaims> {\n\tprivate jwks: jose.JWTVerifyGetKey | null = null;\n\tprivate readonly verifyOptions: jose.JWTVerifyOptions;\n\n\tconstructor(private readonly config: JwtConfig) {\n\t\tthis.verifyOptions = {\n\t\t\tissuer: config.issuer,\n\t\t\taudience: config.audience,\n\t\t\talgorithms:\n\t\t\t\tconfig.algorithms ?? (isJwksConfig(config) ? undefined : ['HS256']),\n\t\t};\n\t}\n\n\tasync verify(token: string): Promise<TClaims> {\n\t\tif (isJwksConfig(this.config)) {\n\t\t\tif (!this.jwks) {\n\t\t\t\tthis.jwks = jose.createRemoteJWKSet(new URL(this.config.jwksUri));\n\t\t\t}\n\t\t\tconst { payload } = await jose.jwtVerify(\n\t\t\t\ttoken,\n\t\t\t\tthis.jwks,\n\t\t\t\tthis.verifyOptions,\n\t\t\t);\n\t\t\treturn payload as unknown as TClaims;\n\t\t}\n\n\t\tconst secret = new TextEncoder().encode(this.config.secret);\n\t\tconst { payload } = await jose.jwtVerify(token, secret, this.verifyOptions);\n\t\treturn payload as unknown as TClaims;\n\t}\n\n\tasync verifyOrNull(token: string): Promise<TClaims | null> {\n\t\ttry {\n\t\t\treturn await this.verify(token);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tclearCache(): void {\n\t\tthis.jwks = null;\n\t}\n}\n\n/**\n * Decode a JWT without verification\n * WARNING: This does NOT verify the token signature!\n */\nexport function decodeJwt<TClaims extends JwtClaims = JwtClaims>(\n\ttoken: string,\n): TClaims {\n\treturn jose.decodeJwt(token) as unknown as TClaims;\n}\n"],"mappings":";;;;;AA8CA,SAAgB,aAAa,QAA4C;CACxE,OAAO,aAAa;AACrB;;;;AAKA,IAAa,cAAb,MAAgE;CAIlC;CAH7B,OAA4C;CAC5C;CAEA,YAAY,QAAoC;EAAnB,KAAA,SAAA;EAC5B,KAAK,gBAAgB;GACpB,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,YACC,OAAO,eAAe,aAAa,MAAM,IAAI,KAAA,IAAY,CAAC,OAAO;EACnE;CACD;CAEA,MAAM,OAAO,OAAiC;EAC7C,IAAI,aAAa,KAAK,MAAM,GAAG;GAC9B,IAAI,CAAC,KAAK,MACT,KAAK,OAAO,KAAK,mBAAmB,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC;GAEjE,MAAM,EAAE,YAAY,MAAM,KAAK,UAC9B,OACA,KAAK,MACL,KAAK,aACN;GACA,OAAO;EACR;EAEA,MAAM,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,OAAO,MAAM;EAC1D,MAAM,EAAE,YAAY,MAAM,KAAK,UAAU,OAAO,QAAQ,KAAK,aAAa;EAC1E,OAAO;CACR;CAEA,MAAM,aAAa,OAAwC;EAC1D,IAAI;GACH,OAAO,MAAM,KAAK,OAAO,KAAK;EAC/B,QAAQ;GACP,OAAO;EACR;CACD;CAEA,aAAmB;EAClB,KAAK,OAAO;CACb;AACD;;;;;AAMA,SAAgB,UACf,OACU;CACV,OAAO,KAAK,UAAU,KAAK;AAC5B"}
|
package/dist/jwt.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as JwtVerifier, c as isJwksConfig, i as JwtSecretConfig, n as JwtConfig, o as TokenExtractionOptions, r as JwtJwksConfig, s as decodeJwt, t as JwtClaims } from "./jwt-CoKrpeMB.cjs";
|
|
2
2
|
export { JwtClaims, JwtConfig, JwtJwksConfig, JwtSecretConfig, JwtVerifier, TokenExtractionOptions, decodeJwt, isJwksConfig };
|
package/dist/jwt.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as JwtVerifier, c as isJwksConfig, i as JwtSecretConfig, n as JwtConfig, o as TokenExtractionOptions, r as JwtJwksConfig, s as decodeJwt, t as JwtClaims } from "./jwt-CoKrpeMB.mjs";
|
|
2
2
|
export { JwtClaims, JwtConfig, JwtJwksConfig, JwtSecretConfig, JwtVerifier, TokenExtractionOptions, decodeJwt, isJwksConfig };
|
package/dist/jwt.mjs
CHANGED
|
@@ -1,3 +1,52 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as jose from "jose";
|
|
2
|
+
//#region src/jwt.ts
|
|
3
|
+
function isJwksConfig(config) {
|
|
4
|
+
return "jwksUri" in config;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* JWT Verifier with JWKS caching
|
|
8
|
+
*/
|
|
9
|
+
var JwtVerifier = class {
|
|
10
|
+
config;
|
|
11
|
+
jwks = null;
|
|
12
|
+
verifyOptions;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.verifyOptions = {
|
|
16
|
+
issuer: config.issuer,
|
|
17
|
+
audience: config.audience,
|
|
18
|
+
algorithms: config.algorithms ?? (isJwksConfig(config) ? void 0 : ["HS256"])
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async verify(token) {
|
|
22
|
+
if (isJwksConfig(this.config)) {
|
|
23
|
+
if (!this.jwks) this.jwks = jose.createRemoteJWKSet(new URL(this.config.jwksUri));
|
|
24
|
+
const { payload } = await jose.jwtVerify(token, this.jwks, this.verifyOptions);
|
|
25
|
+
return payload;
|
|
26
|
+
}
|
|
27
|
+
const secret = new TextEncoder().encode(this.config.secret);
|
|
28
|
+
const { payload } = await jose.jwtVerify(token, secret, this.verifyOptions);
|
|
29
|
+
return payload;
|
|
30
|
+
}
|
|
31
|
+
async verifyOrNull(token) {
|
|
32
|
+
try {
|
|
33
|
+
return await this.verify(token);
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
clearCache() {
|
|
39
|
+
this.jwks = null;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Decode a JWT without verification
|
|
44
|
+
* WARNING: This does NOT verify the token signature!
|
|
45
|
+
*/
|
|
46
|
+
function decodeJwt(token) {
|
|
47
|
+
return jose.decodeJwt(token);
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { JwtVerifier, decodeJwt, isJwksConfig };
|
|
2
51
|
|
|
3
|
-
|
|
52
|
+
//# sourceMappingURL=jwt.mjs.map
|
package/dist/jwt.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.mjs","names":[],"sources":["../src/jwt.ts"],"sourcesContent":["import * as jose from 'jose';\n\n/**\n * Standard JWT claims\n */\nexport interface JwtClaims {\n\tsub?: string;\n\tiss?: string;\n\taud?: string | string[];\n\texp?: number;\n\tiat?: number;\n\tnbf?: number;\n\tjti?: string;\n}\n\n/**\n * Configuration for JWT verification with a symmetric secret\n */\nexport interface JwtSecretConfig {\n\tsecret: string;\n\tissuer?: string;\n\taudience?: string | string[];\n\talgorithms?: string[];\n}\n\n/**\n * Configuration for JWT verification with JWKS\n */\nexport interface JwtJwksConfig {\n\tjwksUri: string;\n\tissuer?: string;\n\taudience?: string | string[];\n\talgorithms?: string[];\n}\n\nexport type JwtConfig = JwtSecretConfig | JwtJwksConfig;\n\n/**\n * Options for token extraction from requests\n */\nexport interface TokenExtractionOptions {\n\theaderName?: string;\n\tcookieName?: string;\n\ttokenPrefix?: string;\n}\n\nexport function isJwksConfig(config: JwtConfig): config is JwtJwksConfig {\n\treturn 'jwksUri' in config;\n}\n\n/**\n * JWT Verifier with JWKS caching\n */\nexport class JwtVerifier<TClaims extends JwtClaims = JwtClaims> {\n\tprivate jwks: jose.JWTVerifyGetKey | null = null;\n\tprivate readonly verifyOptions: jose.JWTVerifyOptions;\n\n\tconstructor(private readonly config: JwtConfig) {\n\t\tthis.verifyOptions = {\n\t\t\tissuer: config.issuer,\n\t\t\taudience: config.audience,\n\t\t\talgorithms:\n\t\t\t\tconfig.algorithms ?? (isJwksConfig(config) ? undefined : ['HS256']),\n\t\t};\n\t}\n\n\tasync verify(token: string): Promise<TClaims> {\n\t\tif (isJwksConfig(this.config)) {\n\t\t\tif (!this.jwks) {\n\t\t\t\tthis.jwks = jose.createRemoteJWKSet(new URL(this.config.jwksUri));\n\t\t\t}\n\t\t\tconst { payload } = await jose.jwtVerify(\n\t\t\t\ttoken,\n\t\t\t\tthis.jwks,\n\t\t\t\tthis.verifyOptions,\n\t\t\t);\n\t\t\treturn payload as unknown as TClaims;\n\t\t}\n\n\t\tconst secret = new TextEncoder().encode(this.config.secret);\n\t\tconst { payload } = await jose.jwtVerify(token, secret, this.verifyOptions);\n\t\treturn payload as unknown as TClaims;\n\t}\n\n\tasync verifyOrNull(token: string): Promise<TClaims | null> {\n\t\ttry {\n\t\t\treturn await this.verify(token);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tclearCache(): void {\n\t\tthis.jwks = null;\n\t}\n}\n\n/**\n * Decode a JWT without verification\n * WARNING: This does NOT verify the token signature!\n */\nexport function decodeJwt<TClaims extends JwtClaims = JwtClaims>(\n\ttoken: string,\n): TClaims {\n\treturn jose.decodeJwt(token) as unknown as TClaims;\n}\n"],"mappings":";;AA8CA,SAAgB,aAAa,QAA4C;CACxE,OAAO,aAAa;AACrB;;;;AAKA,IAAa,cAAb,MAAgE;CAIlC;CAH7B,OAA4C;CAC5C;CAEA,YAAY,QAAoC;EAAnB,KAAA,SAAA;EAC5B,KAAK,gBAAgB;GACpB,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,YACC,OAAO,eAAe,aAAa,MAAM,IAAI,KAAA,IAAY,CAAC,OAAO;EACnE;CACD;CAEA,MAAM,OAAO,OAAiC;EAC7C,IAAI,aAAa,KAAK,MAAM,GAAG;GAC9B,IAAI,CAAC,KAAK,MACT,KAAK,OAAO,KAAK,mBAAmB,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC;GAEjE,MAAM,EAAE,YAAY,MAAM,KAAK,UAC9B,OACA,KAAK,MACL,KAAK,aACN;GACA,OAAO;EACR;EAEA,MAAM,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,OAAO,MAAM;EAC1D,MAAM,EAAE,YAAY,MAAM,KAAK,UAAU,OAAO,QAAQ,KAAK,aAAa;EAC1E,OAAO;CACR;CAEA,MAAM,aAAa,OAAwC;EAC1D,IAAI;GACH,OAAO,MAAM,KAAK,OAAO,KAAK;EAC/B,QAAQ;GACP,OAAO;EACR;CACD;CAEA,aAAmB;EAClB,KAAK,OAAO;CACb;AACD;;;;;AAMA,SAAgB,UACf,OACU;CACV,OAAO,KAAK,UAAU,KAAK;AAC5B"}
|