@rapidraptor/auth-server 0.2.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.
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/firebase/admin.d.ts +18 -0
- package/dist/firebase/admin.d.ts.map +1 -0
- package/dist/firebase/admin.js +96 -0
- package/dist/firebase/admin.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +9 -0
- package/dist/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.js +241 -0
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/authMiddleware.test.d.ts +2 -0
- package/dist/middleware/authMiddleware.test.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.test.js +691 -0
- package/dist/middleware/authMiddleware.test.js.map +1 -0
- package/dist/middleware/logoutHandler.d.ts +9 -0
- package/dist/middleware/logoutHandler.d.ts.map +1 -0
- package/dist/middleware/logoutHandler.js +54 -0
- package/dist/middleware/logoutHandler.js.map +1 -0
- package/dist/middleware/logoutHandler.test.d.ts +2 -0
- package/dist/middleware/logoutHandler.test.d.ts.map +1 -0
- package/dist/middleware/logoutHandler.test.js +103 -0
- package/dist/middleware/logoutHandler.test.js.map +1 -0
- package/dist/session/firestoreSync.d.ts +37 -0
- package/dist/session/firestoreSync.d.ts.map +1 -0
- package/dist/session/firestoreSync.js +88 -0
- package/dist/session/firestoreSync.js.map +1 -0
- package/dist/session/firestoreSync.test.d.ts +2 -0
- package/dist/session/firestoreSync.test.d.ts.map +1 -0
- package/dist/session/firestoreSync.test.js +142 -0
- package/dist/session/firestoreSync.test.js.map +1 -0
- package/dist/session/sessionCache.d.ts +37 -0
- package/dist/session/sessionCache.d.ts.map +1 -0
- package/dist/session/sessionCache.js +63 -0
- package/dist/session/sessionCache.js.map +1 -0
- package/dist/session/sessionCache.test.d.ts +2 -0
- package/dist/session/sessionCache.test.d.ts.map +1 -0
- package/dist/session/sessionCache.test.js +117 -0
- package/dist/session/sessionCache.test.js.map +1 -0
- package/dist/session/sessionService.d.ts +97 -0
- package/dist/session/sessionService.d.ts.map +1 -0
- package/dist/session/sessionService.js +311 -0
- package/dist/session/sessionService.js.map +1 -0
- package/dist/session/sessionService.test.d.ts +2 -0
- package/dist/session/sessionService.test.d.ts.map +1 -0
- package/dist/session/sessionService.test.js +426 -0
- package/dist/session/sessionService.test.js.map +1 -0
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tokenVerifier/errors.d.ts +23 -0
- package/dist/tokenVerifier/errors.d.ts.map +1 -0
- package/dist/tokenVerifier/errors.js +34 -0
- package/dist/tokenVerifier/errors.js.map +1 -0
- package/dist/tokenVerifier/joseTokenVerifier.d.ts +24 -0
- package/dist/tokenVerifier/joseTokenVerifier.d.ts.map +1 -0
- package/dist/tokenVerifier/joseTokenVerifier.js +157 -0
- package/dist/tokenVerifier/joseTokenVerifier.js.map +1 -0
- package/dist/tokenVerifier/types.d.ts +41 -0
- package/dist/tokenVerifier/types.d.ts.map +1 -0
- package/dist/tokenVerifier/types.js +2 -0
- package/dist/tokenVerifier/types.js.map +1 -0
- package/dist/types/middleware.d.ts +33 -0
- package/dist/types/middleware.d.ts.map +1 -0
- package/dist/types/middleware.js +2 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/session.d.ts +7 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as jose from 'jose';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import { TokenVerificationFailedError, TokenVerifierConfigurationError, } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Default JWT token verifier implementation using jose library
|
|
6
|
+
* Supports JWKS URIs, static public keys, and skip verification mode
|
|
7
|
+
*/
|
|
8
|
+
export class JoseTokenVerifier {
|
|
9
|
+
config;
|
|
10
|
+
logger;
|
|
11
|
+
jwksClient;
|
|
12
|
+
cachedPublicKey;
|
|
13
|
+
constructor(config, logger) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
// Validate configuration for production mode
|
|
17
|
+
if (!config.skipVerification && !config.publicKey && !config.jwksUri) {
|
|
18
|
+
throw new TokenVerifierConfigurationError('Either publicKey or jwksUri must be provided when skipVerification is false');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async verify(token, correlationId) {
|
|
22
|
+
if (this.config.skipVerification) {
|
|
23
|
+
// Development/test mode - return mock user
|
|
24
|
+
this.logger?.debug?.('JWT verification skipped - using mock user', {
|
|
25
|
+
event: 'jwt_verification_skipped',
|
|
26
|
+
mockUser: this.config.mockUser,
|
|
27
|
+
correlationId,
|
|
28
|
+
});
|
|
29
|
+
return (this.config.mockUser || {
|
|
30
|
+
sub: 'dev-user',
|
|
31
|
+
email: 'dev@example.com',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Decode JWT for logging
|
|
36
|
+
const payload = jose.decodeJwt(token);
|
|
37
|
+
const protectedHeader = jose.decodeProtectedHeader(token);
|
|
38
|
+
this.logger?.debug?.('JWT token decoded for verification', {
|
|
39
|
+
event: 'jwt_token_decoded',
|
|
40
|
+
header: {
|
|
41
|
+
alg: protectedHeader.alg,
|
|
42
|
+
typ: protectedHeader.typ,
|
|
43
|
+
kid: protectedHeader.kid, // Key ID - safe to log
|
|
44
|
+
},
|
|
45
|
+
payload: {
|
|
46
|
+
sub: payload.sub,
|
|
47
|
+
email: payload.email,
|
|
48
|
+
exp: payload.exp,
|
|
49
|
+
iat: payload.iat,
|
|
50
|
+
},
|
|
51
|
+
config: {
|
|
52
|
+
skipVerification: this.config.skipVerification,
|
|
53
|
+
publicKey: this.config.publicKey ? '[PROVIDED]' : undefined,
|
|
54
|
+
jwksUri: this.config.jwksUri,
|
|
55
|
+
issuer: this.config.issuer,
|
|
56
|
+
audience: this.config.audience,
|
|
57
|
+
},
|
|
58
|
+
correlationId,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
this.logger?.warn?.('Could not decode JWT token for logging - may be malformed', {
|
|
63
|
+
event: 'jwt_decode_failed',
|
|
64
|
+
error: e instanceof Error ? e.message : 'Unknown error',
|
|
65
|
+
correlationId,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const key = await this.getVerificationKey(correlationId);
|
|
70
|
+
// TypeScript can't infer that the union type matches jwtVerify's expected type
|
|
71
|
+
// but both KeyLike and createRemoteJWKSet return value are valid
|
|
72
|
+
const { payload } = await jose.jwtVerify(token, key, {
|
|
73
|
+
issuer: this.config.issuer,
|
|
74
|
+
audience: this.config.audience,
|
|
75
|
+
});
|
|
76
|
+
this.logger?.info?.('JWT verification successful', {
|
|
77
|
+
event: 'jwt_verification_success',
|
|
78
|
+
userId: payload.sub,
|
|
79
|
+
email: payload.email,
|
|
80
|
+
correlationId,
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
sub: payload.sub,
|
|
84
|
+
email: payload.email,
|
|
85
|
+
name: payload.name,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// Handle expired token specifically
|
|
90
|
+
if (error instanceof jose.errors.JWTExpired) {
|
|
91
|
+
this.logger?.warn?.('JWT token has expired', {
|
|
92
|
+
event: 'jwt_token_expired',
|
|
93
|
+
error: error.message,
|
|
94
|
+
correlationId,
|
|
95
|
+
});
|
|
96
|
+
throw new TokenVerificationFailedError('Token has expired', true, error);
|
|
97
|
+
}
|
|
98
|
+
this.logger?.error?.('JWT verification failed', {
|
|
99
|
+
event: 'jwt_verification_failed',
|
|
100
|
+
error: {
|
|
101
|
+
name: error instanceof Error ? error.name : 'Unknown',
|
|
102
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
103
|
+
},
|
|
104
|
+
correlationId,
|
|
105
|
+
});
|
|
106
|
+
throw new TokenVerificationFailedError(`JWT verification failed: ${error.message}`, false, error instanceof Error ? error : undefined);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async getVerificationKey(correlationId) {
|
|
110
|
+
// Prefer static public key if provided
|
|
111
|
+
if (this.config.publicKey) {
|
|
112
|
+
if (!this.cachedPublicKey) {
|
|
113
|
+
this.logger?.debug?.('Loading static public key for JWT verification', {
|
|
114
|
+
event: 'jwt_static_key_loading',
|
|
115
|
+
keyType: this.config.publicKey.startsWith('file://') ? 'file' : 'inline',
|
|
116
|
+
correlationId,
|
|
117
|
+
});
|
|
118
|
+
let pem = this.config.publicKey;
|
|
119
|
+
// If value starts with file:// treat as path
|
|
120
|
+
if (pem.startsWith('file://')) {
|
|
121
|
+
const path = pem.replace('file://', '');
|
|
122
|
+
pem = await fs.readFile(path, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
this.cachedPublicKey = await jose.importSPKI(pem, 'RS256');
|
|
125
|
+
this.logger?.debug?.('Static public key loaded successfully', {
|
|
126
|
+
event: 'jwt_static_key_loaded',
|
|
127
|
+
correlationId,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return this.cachedPublicKey;
|
|
131
|
+
}
|
|
132
|
+
// Otherwise fallback to remote JWKS
|
|
133
|
+
if (!this.jwksClient) {
|
|
134
|
+
if (!this.config.jwksUri) {
|
|
135
|
+
throw new TokenVerifierConfigurationError('JWKS URI not configured');
|
|
136
|
+
}
|
|
137
|
+
this.logger?.debug?.('Creating remote JWKS client', {
|
|
138
|
+
event: 'jwt_jwks_client_created',
|
|
139
|
+
jwksUri: this.config.jwksUri,
|
|
140
|
+
correlationId,
|
|
141
|
+
});
|
|
142
|
+
this.jwksClient = jose.createRemoteJWKSet(new URL(this.config.jwksUri));
|
|
143
|
+
}
|
|
144
|
+
return this.jwksClient;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Clear cached keys (useful for testing or key rotation)
|
|
148
|
+
*/
|
|
149
|
+
clearCache() {
|
|
150
|
+
this.jwksClient = undefined;
|
|
151
|
+
this.cachedPublicKey = undefined;
|
|
152
|
+
this.logger?.debug?.('JWT verification cache cleared', {
|
|
153
|
+
event: 'jwt_cache_cleared',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=joseTokenVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joseTokenVerifier.js","sourceRoot":"","sources":["../../src/tokenVerifier/joseTokenVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for JWT token verification
|
|
3
|
+
*/
|
|
4
|
+
export interface TokenVerifierConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Skip verification (development/test mode only)
|
|
7
|
+
* When true, returns a mock user without verifying the token
|
|
8
|
+
*/
|
|
9
|
+
skipVerification?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Static public key in PEM format for JWT verification
|
|
12
|
+
* Can be provided inline or as a file path (prefix with 'file://')
|
|
13
|
+
* Example: 'file:///path/to/public-key.pem' or '-----BEGIN PUBLIC KEY-----\n...'
|
|
14
|
+
*/
|
|
15
|
+
publicKey?: string;
|
|
16
|
+
/**
|
|
17
|
+
* JWKS (JSON Web Key Set) URI for remote key lookup
|
|
18
|
+
* Used for OAuth providers like Firebase, Auth0, etc.
|
|
19
|
+
* Example: 'https://www.googleapis.com/service_accounts/v1/jwk/...'
|
|
20
|
+
*/
|
|
21
|
+
jwksUri?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Expected JWT issuer (iss claim)
|
|
24
|
+
* If provided, tokens must have matching issuer
|
|
25
|
+
*/
|
|
26
|
+
issuer?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Expected JWT audience (aud claim)
|
|
29
|
+
* If provided, tokens must have matching audience
|
|
30
|
+
*/
|
|
31
|
+
audience?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Mock user to return when skipVerification is true
|
|
34
|
+
*/
|
|
35
|
+
mockUser?: {
|
|
36
|
+
sub: string;
|
|
37
|
+
email?: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tokenVerifier/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tokenVerifier/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for user token verifier
|
|
3
|
+
* Implementations should verify JWT tokens (signature, expiration, issuer, audience)
|
|
4
|
+
* and return the user information from the token payload.
|
|
5
|
+
*
|
|
6
|
+
* This is a generic interface that can be implemented by any project using this library.
|
|
7
|
+
* The implementation is provided via dependency injection to createAuthMiddleware().
|
|
8
|
+
*/
|
|
9
|
+
export interface UserTokenVerifier {
|
|
10
|
+
verify(token: string, correlationId?: string): Promise<{
|
|
11
|
+
sub: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Interface for user token verification error
|
|
18
|
+
* Implementations should throw errors that match this interface
|
|
19
|
+
*/
|
|
20
|
+
export interface UserTokenVerificationError extends Error {
|
|
21
|
+
isExpired?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Logger interface (compatible with winston)
|
|
25
|
+
* Uses Record<string, unknown> for type-safe metadata
|
|
26
|
+
*/
|
|
27
|
+
export interface Logger {
|
|
28
|
+
debug?: (message: string, meta?: Record<string, unknown>) => void;
|
|
29
|
+
info?: (message: string, meta?: Record<string, unknown>) => void;
|
|
30
|
+
warn?: (message: string, meta?: Record<string, unknown>) => void;
|
|
31
|
+
error?: (message: string, meta?: Record<string, unknown>) => void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/types/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxG;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAClE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/types/middleware.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/types/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/types/session.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rapidraptor/auth-server",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Server-side authentication library for Node.js/Express applications",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"test": "vitest"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@rapidraptor/auth-shared": "file:../shared",
|
|
26
|
+
"firebase-admin": "^12.0.0",
|
|
27
|
+
"jose": "^5.2.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/express": "^4.17.21",
|
|
31
|
+
"@types/node": "^20.12.12",
|
|
32
|
+
"express": "^4.19.2",
|
|
33
|
+
"typescript": "^5.4.5",
|
|
34
|
+
"vitest": "^1.6.1"
|
|
35
|
+
}
|
|
36
|
+
}
|