@notoofly/auth-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +307 -0
  4. package/dist/adapters/elysia/index.d.ts +3 -0
  5. package/dist/adapters/elysia/index.d.ts.map +1 -0
  6. package/dist/adapters/elysia/index.js +2 -0
  7. package/dist/adapters/elysia/index.js.map +1 -0
  8. package/dist/adapters/elysia/plugin.d.ts +163 -0
  9. package/dist/adapters/elysia/plugin.d.ts.map +1 -0
  10. package/dist/adapters/elysia/plugin.js +146 -0
  11. package/dist/adapters/elysia/plugin.js.map +1 -0
  12. package/dist/adapters/express/index.d.ts +3 -0
  13. package/dist/adapters/express/index.d.ts.map +1 -0
  14. package/dist/adapters/express/index.js +2 -0
  15. package/dist/adapters/express/index.js.map +1 -0
  16. package/dist/adapters/express/middleware.d.ts +14 -0
  17. package/dist/adapters/express/middleware.d.ts.map +1 -0
  18. package/dist/adapters/express/middleware.js +156 -0
  19. package/dist/adapters/express/middleware.js.map +1 -0
  20. package/dist/core/index.d.ts +3 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +2 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/jwt-verifier.d.ts +16 -0
  25. package/dist/core/jwt-verifier.d.ts.map +1 -0
  26. package/dist/core/jwt-verifier.js +117 -0
  27. package/dist/core/jwt-verifier.js.map +1 -0
  28. package/dist/types/auth-user.d.ts +12 -0
  29. package/dist/types/auth-user.d.ts.map +1 -0
  30. package/dist/types/auth-user.js +2 -0
  31. package/dist/types/auth-user.js.map +1 -0
  32. package/dist/types/index.d.ts +40 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/dist/types/index.js +19 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/utils/authorization.d.ts +9 -0
  37. package/dist/utils/authorization.d.ts.map +1 -0
  38. package/dist/utils/authorization.js +33 -0
  39. package/dist/utils/authorization.js.map +1 -0
  40. package/dist/utils/security.d.ts +31 -0
  41. package/dist/utils/security.d.ts.map +1 -0
  42. package/dist/utils/security.js +55 -0
  43. package/dist/utils/security.js.map +1 -0
  44. package/dist/utils/token-extraction.d.ts +3 -0
  45. package/dist/utils/token-extraction.d.ts.map +1 -0
  46. package/dist/utils/token-extraction.js +24 -0
  47. package/dist/utils/token-extraction.js.map +1 -0
  48. package/package.json +87 -0
@@ -0,0 +1,3 @@
1
+ export type { AuthenticatedRequest, ExpressAuthOptions } from "./middleware.js";
2
+ export { createAuthMiddleware, createGuard, createPermissionGuard, createRoleGuard, } from "./middleware.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACN,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,eAAe,GACf,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAuthMiddleware, createGuard, createPermissionGuard, createRoleGuard, } from "./middleware.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/express/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,eAAe,GACf,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { NextFunction, Request, Response } from "express";
2
+ import type { AuthContext, GuardOptions, JwtVerificationConfig } from "../../types/index.js";
3
+ export interface ExpressAuthOptions extends JwtVerificationConfig {
4
+ readonly extractFrom?: "header" | "cookie" | "both";
5
+ readonly cookieName?: string;
6
+ }
7
+ export interface AuthenticatedRequest extends Request {
8
+ auth?: AuthContext;
9
+ }
10
+ export declare function createAuthMiddleware(options: ExpressAuthOptions): (req: AuthenticatedRequest, res: Response, next: NextFunction) => Promise<void>;
11
+ export declare function createRoleGuard(role: string): (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
12
+ export declare function createPermissionGuard(permission: string): (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
13
+ export declare function createGuard(options: GuardOptions): (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
14
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,kBAAmB,SAAQ,qBAAqB;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACpD,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,IAM9D,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,MAAM,YAAY,KAChB,OAAO,CAAC,IAAI,CAAC,CAmDhB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,IAE1C,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,MAAM,YAAY,KAChB,IAAI,CAiCP;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,IAEtD,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,MAAM,YAAY,KAChB,IAAI,CAiCP;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,IAE/C,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,MAAM,YAAY,KAChB,IAAI,CAiCP"}
@@ -0,0 +1,156 @@
1
+ import { JwtVerifier } from "../../core/jwt-verifier.js";
2
+ import { checkGuard } from "../../utils/authorization.js";
3
+ import { extractTokenFromCookie, extractTokenFromHeader, } from "../../utils/token-extraction.js";
4
+ export function createAuthMiddleware(options) {
5
+ const verifier = new JwtVerifier(options);
6
+ const extractFrom = options.extractFrom ?? "header";
7
+ const cookieName = options.cookieName ?? "access_token";
8
+ return async (req, res, next) => {
9
+ try {
10
+ let token = null;
11
+ switch (extractFrom) {
12
+ case "header":
13
+ token = extractTokenFromHeader(req.headers.authorization);
14
+ break;
15
+ case "cookie":
16
+ token = extractTokenFromCookie(req.headers.cookie, cookieName);
17
+ break;
18
+ case "both":
19
+ token =
20
+ extractTokenFromHeader(req.headers.authorization) ??
21
+ extractTokenFromCookie(req.headers.cookie, cookieName);
22
+ break;
23
+ }
24
+ if (!token) {
25
+ res.status(401).json({
26
+ success: false,
27
+ error: {
28
+ code: "AUTH.TOKEN.MISSING",
29
+ message: "Authentication token is required",
30
+ },
31
+ meta: {
32
+ requestId: res.locals.requestId ?? "unknown",
33
+ timestamp: new Date().toISOString(),
34
+ },
35
+ });
36
+ return;
37
+ }
38
+ const user = await verifier.verifyAccessToken(token);
39
+ req.auth = { user, token };
40
+ next();
41
+ }
42
+ catch (error) {
43
+ res.status(401).json({
44
+ success: false,
45
+ error: {
46
+ code: "AUTH.TOKEN.INVALID",
47
+ message: error instanceof Error ? error.message : "Invalid token",
48
+ },
49
+ meta: {
50
+ requestId: res.locals.requestId ?? "unknown",
51
+ timestamp: new Date().toISOString(),
52
+ },
53
+ });
54
+ }
55
+ };
56
+ }
57
+ export function createRoleGuard(role) {
58
+ return (req, res, next) => {
59
+ if (!req.auth?.user) {
60
+ res.status(401).json({
61
+ success: false,
62
+ error: {
63
+ code: "AUTH.REQUIRED",
64
+ message: "Authentication required",
65
+ },
66
+ meta: {
67
+ requestId: res.locals.requestId ?? "unknown",
68
+ timestamp: new Date().toISOString(),
69
+ },
70
+ });
71
+ return;
72
+ }
73
+ if (!req.auth.user.roles.includes(role)) {
74
+ res.status(403).json({
75
+ success: false,
76
+ error: {
77
+ code: "AUTH.ROLE.REQUIRED",
78
+ message: `Role '${role}' is required`,
79
+ },
80
+ meta: {
81
+ requestId: res.locals.requestId ?? "unknown",
82
+ timestamp: new Date().toISOString(),
83
+ },
84
+ });
85
+ return;
86
+ }
87
+ next();
88
+ };
89
+ }
90
+ export function createPermissionGuard(permission) {
91
+ return (req, res, next) => {
92
+ if (!req.auth?.user) {
93
+ res.status(401).json({
94
+ success: false,
95
+ error: {
96
+ code: "AUTH.REQUIRED",
97
+ message: "Authentication required",
98
+ },
99
+ meta: {
100
+ requestId: res.locals.requestId ?? "unknown",
101
+ timestamp: new Date().toISOString(),
102
+ },
103
+ });
104
+ return;
105
+ }
106
+ if (!req.auth.user.permissions.includes(permission)) {
107
+ res.status(403).json({
108
+ success: false,
109
+ error: {
110
+ code: "AUTH.PERMISSION.REQUIRED",
111
+ message: `Permission '${permission}' is required`,
112
+ },
113
+ meta: {
114
+ requestId: res.locals.requestId ?? "unknown",
115
+ timestamp: new Date().toISOString(),
116
+ },
117
+ });
118
+ return;
119
+ }
120
+ next();
121
+ };
122
+ }
123
+ export function createGuard(options) {
124
+ return (req, res, next) => {
125
+ if (!req.auth?.user) {
126
+ res.status(401).json({
127
+ success: false,
128
+ error: {
129
+ code: "AUTH.REQUIRED",
130
+ message: "Authentication required",
131
+ },
132
+ meta: {
133
+ requestId: res.locals.requestId ?? "unknown",
134
+ timestamp: new Date().toISOString(),
135
+ },
136
+ });
137
+ return;
138
+ }
139
+ if (!checkGuard(req.auth.user, options)) {
140
+ res.status(403).json({
141
+ success: false,
142
+ error: {
143
+ code: "AUTH.GUARD.FAILED",
144
+ message: "Access denied by authorization guard",
145
+ },
146
+ meta: {
147
+ requestId: res.locals.requestId ?? "unknown",
148
+ timestamp: new Date().toISOString(),
149
+ },
150
+ });
151
+ return;
152
+ }
153
+ next();
154
+ };
155
+ }
156
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/adapters/express/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { JwtVerificationConfig } from "../types/index.js";
2
+ export { JwtVerifier } from "./jwt-verifier.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { JwtVerifier } from "./jwt-verifier.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AuthUser, JwtVerificationConfig } from "../types/index.js";
2
+ export declare class JwtVerifier {
3
+ private readonly config;
4
+ private cache;
5
+ private fetchPromise;
6
+ constructor(config: JwtVerificationConfig);
7
+ verifyAccessToken(token: string): Promise<AuthUser>;
8
+ getUserFromToken(token: string): Promise<AuthUser>;
9
+ private getPublicKey;
10
+ private getJwks;
11
+ private fetchJwks;
12
+ private isCacheExpired;
13
+ private decodeTokenHeader;
14
+ private mapPayloadToAuthUser;
15
+ }
16
+ //# sourceMappingURL=jwt-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-verifier.d.ts","sourceRoot":"","sources":["../../src/core/jwt-verifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,QAAQ,EAER,qBAAqB,EACrB,MAAM,mBAAmB,CAAC;AAgB3B,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,YAAY,CAAmC;gBAE3C,MAAM,EAAE,qBAAqB;IAOnC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6BnD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAI1C,YAAY;YAWZ,OAAO;YAgBP,SAAS;IAyBvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,oBAAoB;CAiB5B"}
@@ -0,0 +1,117 @@
1
+ import { importJWK, jwtVerify } from "jose";
2
+ export class JwtVerifier {
3
+ config;
4
+ cache = null;
5
+ fetchPromise = null;
6
+ constructor(config) {
7
+ this.config = {
8
+ cacheTtl: 300000, // 5 minutes default
9
+ ...config,
10
+ };
11
+ }
12
+ async verifyAccessToken(token) {
13
+ try {
14
+ // Decode token to get key ID
15
+ const header = this.decodeTokenHeader(token);
16
+ const keyId = header.kid;
17
+ if (!keyId) {
18
+ throw new Error("Token missing key ID (kid)");
19
+ }
20
+ // Get public key
21
+ const publicKey = await this.getPublicKey(keyId);
22
+ // Verify token
23
+ const { payload } = await jwtVerify(token, publicKey, {
24
+ issuer: this.config.issuer,
25
+ audience: this.config.audience,
26
+ algorithms: ["RS256", "ES256"],
27
+ });
28
+ return this.mapPayloadToAuthUser(payload);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof Error) {
32
+ throw new Error(`JWT verification failed: ${error.message}`);
33
+ }
34
+ throw new Error("JWT verification failed: Unknown error");
35
+ }
36
+ }
37
+ async getUserFromToken(token) {
38
+ return this.verifyAccessToken(token);
39
+ }
40
+ async getPublicKey(keyId) {
41
+ const jwks = await this.getJwks();
42
+ const key = jwks.keys.find((k) => k.kid === keyId);
43
+ if (!key) {
44
+ throw new Error(`Key with ID ${keyId} not found in JWKS`);
45
+ }
46
+ return importJWK(key);
47
+ }
48
+ async getJwks() {
49
+ // Check cache first
50
+ if (this.cache && !this.isCacheExpired(this.cache)) {
51
+ return this.cache;
52
+ }
53
+ // If fetch is in progress, wait for it
54
+ if (this.fetchPromise) {
55
+ return this.fetchPromise;
56
+ }
57
+ // Start new fetch
58
+ this.fetchPromise = this.fetchJwks();
59
+ return this.fetchPromise;
60
+ }
61
+ async fetchJwks() {
62
+ try {
63
+ const response = await fetch(this.config.jwksUri);
64
+ if (!response.ok) {
65
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
66
+ }
67
+ const jwks = (await response.json());
68
+ const now = Date.now();
69
+ this.cache = {
70
+ keys: jwks.keys,
71
+ fetchedAt: now,
72
+ expiresAt: now + (this.config.cacheTtl ?? 300000),
73
+ };
74
+ return this.cache;
75
+ }
76
+ catch (error) {
77
+ this.fetchPromise = null;
78
+ throw error;
79
+ }
80
+ finally {
81
+ this.fetchPromise = null;
82
+ }
83
+ }
84
+ isCacheExpired(cache) {
85
+ return Date.now() >= cache.expiresAt;
86
+ }
87
+ decodeTokenHeader(token) {
88
+ const parts = token.split(".");
89
+ if (parts.length !== 3) {
90
+ throw new Error("Invalid token format");
91
+ }
92
+ try {
93
+ const header = JSON.parse(atob(parts[0] ?? "{}"));
94
+ return header;
95
+ }
96
+ catch {
97
+ throw new Error("Failed to decode token header");
98
+ }
99
+ }
100
+ mapPayloadToAuthUser(payload) {
101
+ return {
102
+ sub: payload.sub,
103
+ email: typeof payload.email === "string" ? payload.email : "",
104
+ roles: payload.roles ?? [],
105
+ permissions: payload.permissions ?? [],
106
+ iat: payload.iat,
107
+ exp: payload.exp,
108
+ iss: payload.iss,
109
+ aud: typeof payload.aud === "string"
110
+ ? payload.aud
111
+ : Array.isArray(payload.aud)
112
+ ? (payload.aud[0] ?? "")
113
+ : "",
114
+ };
115
+ }
116
+ }
117
+ //# sourceMappingURL=jwt-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-verifier.js","sourceRoot":"","sources":["../../src/core/jwt-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { JWTPayload } from "jose";
2
+ export interface AuthUser extends JWTPayload {
3
+ readonly sub: string;
4
+ readonly email?: string;
5
+ readonly roles: readonly string[];
6
+ readonly permissions: readonly string[];
7
+ readonly iat: number;
8
+ readonly exp: number;
9
+ readonly iss: string;
10
+ readonly aud: string;
11
+ }
12
+ //# sourceMappingURL=auth-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-user.d.ts","sourceRoot":"","sources":["../../src/types/auth-user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-user.js","sourceRoot":"","sources":["../../src/types/auth-user.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ export interface AuthUser {
2
+ readonly sub: string;
3
+ readonly email?: string;
4
+ readonly roles: readonly string[];
5
+ readonly permissions: readonly string[];
6
+ readonly iat: number;
7
+ readonly exp: number;
8
+ readonly iss: string;
9
+ readonly aud: string;
10
+ }
11
+ export interface JwtVerificationConfig {
12
+ readonly jwksUri: string;
13
+ readonly issuer: string;
14
+ readonly audience: string;
15
+ readonly cacheTtl?: number;
16
+ }
17
+ export interface JwksCache {
18
+ readonly keys: readonly any[];
19
+ readonly fetchedAt: number;
20
+ readonly expiresAt: number;
21
+ }
22
+ export type Algorithm = "RS256" | "ES256";
23
+ export interface GuardOptions {
24
+ readonly roles?: readonly string[];
25
+ readonly permissions?: readonly string[];
26
+ }
27
+ export interface AuthContext {
28
+ readonly user: AuthUser;
29
+ readonly token: string;
30
+ }
31
+ export declare class JwtVerificationError extends Error {
32
+ readonly code: string;
33
+ readonly token?: string | undefined;
34
+ constructor(message: string, code: string, token?: string | undefined);
35
+ }
36
+ export declare class JwksFetchError extends Error {
37
+ readonly cause?: Error | undefined;
38
+ constructor(message: string, cause?: Error | undefined);
39
+ }
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG7B,IAAI,EAAE,MAAM;aACZ,KAAK,CAAC,EAAE,MAAM;gBAF9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,YAAA;CAK/B;AAED,qBAAa,cAAe,SAAQ,KAAK;aAGvB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAK9B"}
@@ -0,0 +1,19 @@
1
+ export class JwtVerificationError extends Error {
2
+ code;
3
+ token;
4
+ constructor(message, code, token) {
5
+ super(message);
6
+ this.code = code;
7
+ this.token = token;
8
+ this.name = "JwtVerificationError";
9
+ }
10
+ }
11
+ export class JwksFetchError extends Error {
12
+ cause;
13
+ constructor(message, cause) {
14
+ super(message);
15
+ this.cause = cause;
16
+ this.name = "JwksFetchError";
17
+ }
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAoCA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAG7B;IACA;IAHjB,YACC,OAAe,EACC,IAAY,EACZ,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACpC,CAAC;CACD;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGvB;IAFjB,YACC,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC9B,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ import type { AuthUser, GuardOptions } from "../types/index.js";
2
+ export declare function hasRole(user: AuthUser, role: string): boolean;
3
+ export declare function hasPermission(user: AuthUser, permission: string): boolean;
4
+ export declare function hasAnyRole(user: AuthUser, roles: readonly string[]): boolean;
5
+ export declare function hasAllRoles(user: AuthUser, roles: readonly string[]): boolean;
6
+ export declare function hasAnyPermission(user: AuthUser, permissions: readonly string[]): boolean;
7
+ export declare function hasAllPermissions(user: AuthUser, permissions: readonly string[]): boolean;
8
+ export declare function checkGuard(user: AuthUser, options: GuardOptions): boolean;
9
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/utils/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhE,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE7E;AAED,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAET;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAET;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAgBzE"}
@@ -0,0 +1,33 @@
1
+ export function hasRole(user, role) {
2
+ return user.roles.includes(role);
3
+ }
4
+ export function hasPermission(user, permission) {
5
+ return user.permissions.includes(permission);
6
+ }
7
+ export function hasAnyRole(user, roles) {
8
+ return roles.some((role) => hasRole(user, role));
9
+ }
10
+ export function hasAllRoles(user, roles) {
11
+ return roles.every((role) => hasRole(user, role));
12
+ }
13
+ export function hasAnyPermission(user, permissions) {
14
+ return permissions.some((permission) => hasPermission(user, permission));
15
+ }
16
+ export function hasAllPermissions(user, permissions) {
17
+ return permissions.every((permission) => hasPermission(user, permission));
18
+ }
19
+ export function checkGuard(user, options) {
20
+ const { roles, permissions } = options;
21
+ if (roles && roles.length > 0) {
22
+ if (!hasAnyRole(user, roles)) {
23
+ return false;
24
+ }
25
+ }
26
+ if (permissions && permissions.length > 0) {
27
+ if (!hasAnyPermission(user, permissions)) {
28
+ return false;
29
+ }
30
+ }
31
+ return true;
32
+ }
33
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/utils/authorization.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,IAAY;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,UAAkB;IAC/D,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAc,EAAE,KAAwB;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,KAAwB;IACnE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,IAAc,EACd,WAA8B;IAE9B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,IAAc,EACd,WAA8B;IAE9B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAc,EAAE,OAAqB;IAC/D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Security utilities for production environment
3
+ */
4
+ export interface SecurityConfig {
5
+ allowedOrigins: string[];
6
+ maxRequestSize: number;
7
+ rateLimiting: {
8
+ enabled: boolean;
9
+ windowMs: number;
10
+ maxRequests: number;
11
+ };
12
+ cookies: {
13
+ secure: boolean;
14
+ httpOnly: boolean;
15
+ sameSite: "strict" | "lax" | "none";
16
+ };
17
+ }
18
+ export declare const defaultSecurityConfig: SecurityConfig;
19
+ /**
20
+ * Validate origin against allowed origins
21
+ */
22
+ export declare function validateOrigin(origin: string | undefined): boolean;
23
+ /**
24
+ * Sanitize error messages for production
25
+ */
26
+ export declare function sanitizeError(error: Error | string): string;
27
+ /**
28
+ * Generate secure random token
29
+ */
30
+ export declare function generateSecureToken(length?: number): string;
31
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;KACpC,CAAC;CACF;AAED,eAAO,MAAM,qBAAqB,EAAE,cAenC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQlE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAS3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAK,GAAG,MAAM,CAUvD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Security utilities for production environment
3
+ */
4
+ export const defaultSecurityConfig = {
5
+ allowedOrigins: process.env.ALLOWED_ORIGINS?.split(",") || [
6
+ "https://yourdomain.com",
7
+ ],
8
+ maxRequestSize: 10 * 1024 * 1024, // 10MB
9
+ rateLimiting: {
10
+ enabled: process.env.NODE_ENV === "production",
11
+ windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || "60000", 10),
12
+ maxRequests: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || "100", 10),
13
+ },
14
+ cookies: {
15
+ secure: process.env.NODE_ENV === "production",
16
+ httpOnly: true,
17
+ sameSite: "strict",
18
+ },
19
+ };
20
+ /**
21
+ * Validate origin against allowed origins
22
+ */
23
+ export function validateOrigin(origin) {
24
+ if (!origin)
25
+ return false;
26
+ const allowedOrigins = defaultSecurityConfig.allowedOrigins;
27
+ return allowedOrigins.some((allowed) => {
28
+ if (allowed === "*")
29
+ return true;
30
+ return origin === allowed || origin.startsWith(allowed.replace("*", ""));
31
+ });
32
+ }
33
+ /**
34
+ * Sanitize error messages for production
35
+ */
36
+ export function sanitizeError(error) {
37
+ const message = typeof error === "string" ? error : error.message;
38
+ if (process.env.NODE_ENV === "production") {
39
+ // Remove sensitive information from error messages
40
+ return message.replace(/password|token|secret|key/gi, "[REDACTED]");
41
+ }
42
+ return message;
43
+ }
44
+ /**
45
+ * Generate secure random token
46
+ */
47
+ export function generateSecureToken(length = 32) {
48
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
49
+ let result = "";
50
+ for (let i = 0; i < length; i++) {
51
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
52
+ }
53
+ return result;
54
+ }
55
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACpD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI;QAC1D,wBAAwB;KACxB;IACD,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IACzC,YAAY,EAAE;QACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAC9C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC;QACnE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,EAAE,EAAE,CAAC;KACvE;IACD,OAAO,EAAE;QACR,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAC7C,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,QAAQ;KAClB;CACD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAA0B;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC;IAC5D,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAqB;IAClD,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAElE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC3C,mDAAmD;QACnD,OAAO,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAM,GAAG,EAAE;IAC9C,MAAM,KAAK,GACV,gEAAgE,CAAC;IAClE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function extractTokenFromHeader(authHeader: string | undefined | null): string | null;
2
+ export declare function extractTokenFromCookie(cookieHeader: string | undefined | null, cookieName?: string): string | null;
3
+ //# sourceMappingURL=token-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-extraction.d.ts","sourceRoot":"","sources":["../../src/utils/token-extraction.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CACrC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GACnC,MAAM,GAAG,IAAI,CAWf;AAED,wBAAgB,sBAAsB,CACrC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACvC,UAAU,SAAiB,GACzB,MAAM,GAAG,IAAI,CAcf"}