@veloxts/auth 0.3.3 → 0.3.4
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/README.md +755 -30
- package/dist/adapter.d.ts +710 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +581 -0
- package/dist/adapter.js.map +1 -0
- package/dist/adapters/better-auth.d.ts +271 -0
- package/dist/adapters/better-auth.d.ts.map +1 -0
- package/dist/adapters/better-auth.js +341 -0
- package/dist/adapters/better-auth.js.map +1 -0
- package/dist/adapters/index.d.ts +28 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/csrf.d.ts +294 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/csrf.js +396 -0
- package/dist/csrf.js.map +1 -0
- package/dist/guards.d.ts +139 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +247 -0
- package/dist/guards.js.map +1 -0
- package/dist/hash.d.ts +85 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +220 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +25 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -36
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +128 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +363 -0
- package/dist/jwt.js.map +1 -0
- package/dist/middleware.d.ts +87 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +241 -0
- package/dist/middleware.js.map +1 -0
- package/dist/plugin.d.ts +107 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +174 -0
- package/dist/plugin.js.map +1 -0
- package/dist/policies.d.ts +137 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +240 -0
- package/dist/policies.js.map +1 -0
- package/dist/session.d.ts +494 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +795 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +251 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -7
package/dist/hash.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password hashing utilities for @veloxts/auth
|
|
3
|
+
* @module auth/hash
|
|
4
|
+
*/
|
|
5
|
+
import { randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
const scryptAsync = promisify(scrypt);
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const DEFAULT_BCRYPT_ROUNDS = 12;
|
|
12
|
+
const DEFAULT_ARGON2_MEMORY_COST = 65536; // 64 MB
|
|
13
|
+
const DEFAULT_ARGON2_TIME_COST = 3;
|
|
14
|
+
const DEFAULT_ARGON2_PARALLELISM = 4;
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Password Hasher Class
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Password hasher with configurable algorithms
|
|
20
|
+
*
|
|
21
|
+
* Supports bcrypt and argon2 algorithms. Falls back to scrypt-based
|
|
22
|
+
* implementation when native modules are not available.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const hasher = new PasswordHasher({ algorithm: 'bcrypt', bcryptRounds: 12 });
|
|
27
|
+
*
|
|
28
|
+
* // Hash a password
|
|
29
|
+
* const hash = await hasher.hash('mypassword123');
|
|
30
|
+
*
|
|
31
|
+
* // Verify a password
|
|
32
|
+
* const isValid = await hasher.verify('mypassword123', hash);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class PasswordHasher {
|
|
36
|
+
config;
|
|
37
|
+
bcrypt = null;
|
|
38
|
+
argon2 = null;
|
|
39
|
+
constructor(config = {}) {
|
|
40
|
+
this.config = {
|
|
41
|
+
algorithm: config.algorithm ?? 'bcrypt',
|
|
42
|
+
bcryptRounds: config.bcryptRounds ?? DEFAULT_BCRYPT_ROUNDS,
|
|
43
|
+
argon2MemoryCost: config.argon2MemoryCost ?? DEFAULT_ARGON2_MEMORY_COST,
|
|
44
|
+
argon2TimeCost: config.argon2TimeCost ?? DEFAULT_ARGON2_TIME_COST,
|
|
45
|
+
argon2Parallelism: config.argon2Parallelism ?? DEFAULT_ARGON2_PARALLELISM,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Lazily load bcrypt module
|
|
50
|
+
*/
|
|
51
|
+
async loadBcrypt() {
|
|
52
|
+
if (!this.bcrypt) {
|
|
53
|
+
try {
|
|
54
|
+
this.bcrypt = await import('bcrypt');
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
throw new Error('bcrypt module not found. Install it with: pnpm add bcrypt && pnpm add -D @types/bcrypt');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return this.bcrypt;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Lazily load argon2 module
|
|
64
|
+
*/
|
|
65
|
+
async loadArgon2() {
|
|
66
|
+
if (!this.argon2) {
|
|
67
|
+
try {
|
|
68
|
+
this.argon2 = await import('argon2');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new Error('argon2 module not found. Install it with: pnpm add argon2');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return this.argon2;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Hash a password using the configured algorithm
|
|
78
|
+
*/
|
|
79
|
+
async hash(password) {
|
|
80
|
+
if (this.config.algorithm === 'argon2') {
|
|
81
|
+
return this.hashWithArgon2(password);
|
|
82
|
+
}
|
|
83
|
+
return this.hashWithBcrypt(password);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Verify a password against a hash
|
|
87
|
+
*/
|
|
88
|
+
async verify(password, hash) {
|
|
89
|
+
// Detect hash type from format
|
|
90
|
+
if (hash.startsWith('$argon2')) {
|
|
91
|
+
return this.verifyWithArgon2(password, hash);
|
|
92
|
+
}
|
|
93
|
+
if (hash.startsWith('$2')) {
|
|
94
|
+
return this.verifyWithBcrypt(password, hash);
|
|
95
|
+
}
|
|
96
|
+
if (hash.startsWith('$scrypt$')) {
|
|
97
|
+
return this.verifyWithScrypt(password, hash);
|
|
98
|
+
}
|
|
99
|
+
throw new Error('Unknown hash format');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Hash using bcrypt
|
|
103
|
+
*/
|
|
104
|
+
async hashWithBcrypt(password) {
|
|
105
|
+
try {
|
|
106
|
+
const bcrypt = await this.loadBcrypt();
|
|
107
|
+
return bcrypt.hash(password, this.config.bcryptRounds);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
// Fallback to scrypt if bcrypt fails
|
|
111
|
+
if (error.message.includes('not found')) {
|
|
112
|
+
console.warn('bcrypt not available, falling back to scrypt');
|
|
113
|
+
return this.hashWithScrypt(password);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Verify using bcrypt
|
|
120
|
+
*/
|
|
121
|
+
async verifyWithBcrypt(password, hash) {
|
|
122
|
+
const bcrypt = await this.loadBcrypt();
|
|
123
|
+
return bcrypt.compare(password, hash);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Hash using argon2
|
|
127
|
+
*/
|
|
128
|
+
async hashWithArgon2(password) {
|
|
129
|
+
try {
|
|
130
|
+
const argon2 = await this.loadArgon2();
|
|
131
|
+
return argon2.hash(password, {
|
|
132
|
+
memoryCost: this.config.argon2MemoryCost,
|
|
133
|
+
timeCost: this.config.argon2TimeCost,
|
|
134
|
+
parallelism: this.config.argon2Parallelism,
|
|
135
|
+
type: 2, // argon2id
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
// Fallback to scrypt if argon2 fails
|
|
140
|
+
if (error.message.includes('not found')) {
|
|
141
|
+
console.warn('argon2 not available, falling back to scrypt');
|
|
142
|
+
return this.hashWithScrypt(password);
|
|
143
|
+
}
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Verify using argon2
|
|
149
|
+
*/
|
|
150
|
+
async verifyWithArgon2(password, hash) {
|
|
151
|
+
const argon2 = await this.loadArgon2();
|
|
152
|
+
return argon2.verify(hash, password);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Hash using Node.js built-in scrypt (fallback)
|
|
156
|
+
*/
|
|
157
|
+
async hashWithScrypt(password) {
|
|
158
|
+
const salt = randomBytes(32);
|
|
159
|
+
const derivedKey = (await scryptAsync(password, salt, 64));
|
|
160
|
+
return `$scrypt$${salt.toString('hex')}$${derivedKey.toString('hex')}`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Verify using scrypt
|
|
164
|
+
*/
|
|
165
|
+
async verifyWithScrypt(password, hash) {
|
|
166
|
+
const parts = hash.split('$');
|
|
167
|
+
if (parts.length !== 4 || parts[1] !== 'scrypt') {
|
|
168
|
+
throw new Error('Invalid scrypt hash format');
|
|
169
|
+
}
|
|
170
|
+
const salt = Buffer.from(parts[2], 'hex');
|
|
171
|
+
const storedKey = Buffer.from(parts[3], 'hex');
|
|
172
|
+
const derivedKey = (await scryptAsync(password, salt, 64));
|
|
173
|
+
return timingSafeEqual(storedKey, derivedKey);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if a hash needs rehashing (algorithm or cost changed)
|
|
177
|
+
*/
|
|
178
|
+
needsRehash(hash) {
|
|
179
|
+
// If using argon2 but hash is bcrypt/scrypt, rehash
|
|
180
|
+
if (this.config.algorithm === 'argon2' && !hash.startsWith('$argon2')) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
// If using bcrypt but hash is argon2/scrypt, rehash
|
|
184
|
+
if (this.config.algorithm === 'bcrypt' && !hash.startsWith('$2')) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
// TODO: Check bcrypt rounds from hash and compare
|
|
188
|
+
// bcrypt hashes include rounds in format: $2b$XX$...
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Creates a new password hasher instance
|
|
194
|
+
*/
|
|
195
|
+
export function createPasswordHasher(config) {
|
|
196
|
+
return new PasswordHasher(config);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Default password hasher instance (bcrypt, 12 rounds)
|
|
200
|
+
*/
|
|
201
|
+
let defaultHasher = null;
|
|
202
|
+
/**
|
|
203
|
+
* Hash a password using the default hasher
|
|
204
|
+
*/
|
|
205
|
+
export async function hashPassword(password) {
|
|
206
|
+
if (!defaultHasher) {
|
|
207
|
+
defaultHasher = new PasswordHasher();
|
|
208
|
+
}
|
|
209
|
+
return defaultHasher.hash(password);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Verify a password using the default hasher
|
|
213
|
+
*/
|
|
214
|
+
export async function verifyPassword(password, hash) {
|
|
215
|
+
if (!defaultHasher) {
|
|
216
|
+
defaultHasher = new PasswordHasher();
|
|
217
|
+
}
|
|
218
|
+
return defaultHasher.verify(password, hash);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,40 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @veloxts/auth - Authentication and authorization system
|
|
3
3
|
*
|
|
4
|
-
* Provides authentication
|
|
5
|
-
*
|
|
4
|
+
* Provides JWT authentication, password hashing, authorization guards,
|
|
5
|
+
* resource policies, and rate limiting for VeloxTS applications.
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
* @module @veloxts/auth
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
-
export
|
|
10
|
+
export { AUTH_VERSION } from './plugin.js';
|
|
11
|
+
export type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, GuardFunction, HashConfig, JwtConfig,
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* @deprecated Use SessionConfig from session.ts for full session management
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
middleware: () => void;
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Authorization guard decorator (placeholder)
|
|
36
|
-
*
|
|
37
|
-
* @note Full implementation coming in v1.1+
|
|
38
|
-
*/
|
|
39
|
-
export declare function guard(permissions: string[]): (target: unknown) => unknown;
|
|
15
|
+
LegacySessionConfig, PolicyAction, PolicyDefinition, RateLimitConfig, TokenPair, TokenPayload, User, } from './types.js';
|
|
16
|
+
export { AuthError } from './types.js';
|
|
17
|
+
export type { TokenStore } from './jwt.js';
|
|
18
|
+
export { createInMemoryTokenStore, createJwtManager, generateTokenId, JwtManager, parseTimeToSeconds, } from './jwt.js';
|
|
19
|
+
export { createPasswordHasher, hashPassword, PasswordHasher, verifyPassword, } from './hash.js';
|
|
20
|
+
export { allOf, anyOf, authenticated, defineGuard, emailVerified, executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
|
|
21
|
+
export { authorize, can, cannot, clearPolicies, createAdminOnlyPolicy, createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy, definePolicy, getPolicy, registerPolicy, } from './policies.js';
|
|
22
|
+
export { clearRateLimitStore, createAuthMiddleware, createRateLimitMiddleware, } from './middleware.js';
|
|
23
|
+
export type { AuthPluginOptions, AuthService } from './plugin.js';
|
|
24
|
+
export { authPlugin, createAuthPlugin } from './plugin.js';
|
|
25
|
+
export type { CsrfConfig, CsrfContext, CsrfCookieConfig, CsrfErrorCode, CsrfManager, CsrfMiddlewareOptions, CsrfTokenConfig, CsrfTokenData, CsrfTokenResult, CsrfValidationConfig, } from './csrf.js';
|
|
26
|
+
export { CsrfError, createCsrfManager, createCsrfMiddleware } from './csrf.js';
|
|
27
|
+
export type { Session, SessionAuthContext, SessionConfig, SessionContext, SessionCookieConfig, SessionData, SessionExpirationConfig, SessionManager, SessionMiddlewareOptions, SessionStore, StoredSession, } from './session.js';
|
|
28
|
+
export { createInMemorySessionStore, createSessionManager, createSessionMiddleware, isSessionAuthenticated, loginSession, logoutSession, } from './session.js';
|
|
29
|
+
export type { AdapterAuthContext, AdapterHttpMethod, AdapterMiddlewareOptions, AdapterRoute, AdapterSession, AdapterSessionResult, AdapterUser, AuthAdapter, AuthAdapterConfig, AuthAdapterErrorCode, AuthAdapterPluginOptions, InferAdapterConfig, } from './adapter.js';
|
|
30
|
+
export { AuthAdapterError, BaseAuthAdapter, createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter, isAuthAdapter, } from './adapter.js';
|
|
31
|
+
export type { BetterAuthAdapterConfig, BetterAuthApi, BetterAuthHandler, BetterAuthInstance, BetterAuthSession, BetterAuthSessionResult, BetterAuthUser, } from './adapters/better-auth.js';
|
|
32
|
+
export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
|
|
40
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,EAEf,aAAa,EACb,UAAU,EAEV,SAAS;AACT;;GAEG;AACH,mBAAmB,EAEnB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,YAAY,EAEZ,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAMlB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAMnB,OAAO,EAEL,KAAK,EACL,KAAK,EAEL,aAAa,EAEb,WAAW,EACX,aAAa,EAEb,YAAY,EACZ,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,GAAG,EACH,OAAO,GACR,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,SAAS,EAET,GAAG,EACH,MAAM,EACN,aAAa,EACb,qBAAqB,EAErB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EAEpB,YAAY,EACZ,SAAS,EAET,cAAc,GACf,MAAM,eAAe,CAAC;AAMvB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAMzB,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAM3D,YAAY,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAM/E,YAAY,EAEV,OAAO,EAEP,kBAAkB,EAElB,aAAa,EACb,cAAc,EACd,mBAAmB,EAEnB,WAAW,EACX,uBAAuB,EAEvB,cAAc,EAEd,wBAAwB,EAExB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,0BAA0B,EAE1B,oBAAoB,EAEpB,uBAAuB,EAEvB,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AAMtB,YAAY,EAEV,kBAAkB,EAElB,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EAEZ,cAAc,EACd,oBAAoB,EACpB,WAAW,EAEX,WAAW,EAEX,iBAAiB,EAEjB,oBAAoB,EAEpB,wBAAwB,EAExB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,gBAAgB,EAEhB,eAAe,EAEf,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EAEjB,aAAa,GACd,MAAM,cAAc,CAAC;AAMtB,YAAY,EACV,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,42 +1,69 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @veloxts/auth - Authentication and authorization system
|
|
3
3
|
*
|
|
4
|
-
* Provides authentication
|
|
5
|
-
*
|
|
4
|
+
* Provides JWT authentication, password hashing, authorization guards,
|
|
5
|
+
* resource policies, and rate limiting for VeloxTS applications.
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
* @module @veloxts/auth
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Version Export
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export { AUTH_VERSION } from './plugin.js';
|
|
14
|
+
export { AuthError } from './types.js';
|
|
15
|
+
export { createInMemoryTokenStore, createJwtManager, generateTokenId, JwtManager, parseTimeToSeconds, } from './jwt.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Password Hashing
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export { createPasswordHasher, hashPassword, PasswordHasher, verifyPassword, } from './hash.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Guards
|
|
22
|
+
// ============================================================================
|
|
23
|
+
export {
|
|
24
|
+
// Combinators
|
|
25
|
+
allOf, anyOf,
|
|
26
|
+
// Built-in guards
|
|
27
|
+
authenticated,
|
|
28
|
+
// Factory functions
|
|
29
|
+
defineGuard, emailVerified,
|
|
30
|
+
// Execution
|
|
31
|
+
executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Policies
|
|
34
|
+
// ============================================================================
|
|
35
|
+
export { authorize,
|
|
36
|
+
// Authorization checks
|
|
37
|
+
can, cannot, clearPolicies, createAdminOnlyPolicy,
|
|
38
|
+
// Common patterns
|
|
39
|
+
createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy,
|
|
40
|
+
// Factory
|
|
41
|
+
definePolicy, getPolicy,
|
|
42
|
+
// Registry
|
|
43
|
+
registerPolicy, } from './policies.js';
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Middleware
|
|
46
|
+
// ============================================================================
|
|
47
|
+
export { clearRateLimitStore, createAuthMiddleware, createRateLimitMiddleware, } from './middleware.js';
|
|
48
|
+
export { authPlugin, createAuthPlugin } from './plugin.js';
|
|
49
|
+
export { CsrfError, createCsrfManager, createCsrfMiddleware } from './csrf.js';
|
|
50
|
+
export {
|
|
51
|
+
// Store implementations
|
|
52
|
+
createInMemorySessionStore,
|
|
53
|
+
// Session manager
|
|
54
|
+
createSessionManager,
|
|
55
|
+
// Middleware factory
|
|
56
|
+
createSessionMiddleware,
|
|
57
|
+
// Helper functions
|
|
58
|
+
isSessionAuthenticated, loginSession, logoutSession, } from './session.js';
|
|
59
|
+
export {
|
|
60
|
+
// Error class
|
|
61
|
+
AuthAdapterError,
|
|
62
|
+
// Abstract base class
|
|
63
|
+
BaseAuthAdapter,
|
|
64
|
+
// Factory functions
|
|
65
|
+
createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter,
|
|
66
|
+
// Type guard
|
|
67
|
+
isAuthAdapter, } from './adapter.js';
|
|
68
|
+
export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
|
|
42
69
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6B3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO;AACL,cAAc;AACd,KAAK,EACL,KAAK;AACL,kBAAkB;AAClB,aAAa;AACb,oBAAoB;AACpB,WAAW,EACX,aAAa;AACb,YAAY;AACZ,YAAY,EACZ,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,GAAG,EACH,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EACL,SAAS;AACT,uBAAuB;AACvB,GAAG,EACH,MAAM,EACN,aAAa,EACb,qBAAqB;AACrB,kBAAkB;AAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB;AACpB,UAAU;AACV,YAAY,EACZ,SAAS;AACT,WAAW;AACX,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB3D,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AA0B/E,OAAO;AACL,wBAAwB;AACxB,0BAA0B;AAC1B,kBAAkB;AAClB,oBAAoB;AACpB,qBAAqB;AACrB,uBAAuB;AACvB,mBAAmB;AACnB,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AA4BtB,OAAO;AACL,cAAc;AACd,gBAAgB;AAChB,sBAAsB;AACtB,eAAe;AACf,oBAAoB;AACpB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB;AACjB,aAAa;AACb,aAAa,GACd,MAAM,cAAc,CAAC;AAetB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/jwt.d.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT token utilities for @veloxts/auth
|
|
3
|
+
* @module auth/jwt
|
|
4
|
+
*/
|
|
5
|
+
import type { JwtConfig, TokenPair, TokenPayload, User } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parses time string to seconds
|
|
8
|
+
* Supports: '15m', '1h', '7d', '30d', etc.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseTimeToSeconds(time: string): number;
|
|
11
|
+
/**
|
|
12
|
+
* Generate a unique token ID
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateTokenId(): string;
|
|
15
|
+
/**
|
|
16
|
+
* JWT token manager
|
|
17
|
+
*
|
|
18
|
+
* Handles token creation, verification, and refresh.
|
|
19
|
+
* Uses HS256 (HMAC-SHA256) algorithm.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const jwt = new JwtManager({
|
|
24
|
+
* secret: process.env.JWT_SECRET!,
|
|
25
|
+
* accessTokenExpiry: '15m',
|
|
26
|
+
* refreshTokenExpiry: '7d',
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Create tokens for user
|
|
30
|
+
* const tokens = jwt.createTokenPair(user);
|
|
31
|
+
*
|
|
32
|
+
* // Verify access token
|
|
33
|
+
* const payload = jwt.verifyToken(tokens.accessToken);
|
|
34
|
+
*
|
|
35
|
+
* // Refresh tokens
|
|
36
|
+
* const newTokens = jwt.refreshTokens(tokens.refreshToken);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare class JwtManager {
|
|
40
|
+
private readonly config;
|
|
41
|
+
constructor(config: JwtConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Creates a JWT token with the given payload
|
|
44
|
+
*/
|
|
45
|
+
createToken(payload: Omit<TokenPayload, 'iat' | 'exp'> & {
|
|
46
|
+
sub: string;
|
|
47
|
+
email: string;
|
|
48
|
+
type: TokenPayload['type'];
|
|
49
|
+
}, expiresIn: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Verifies a JWT token and returns the payload
|
|
52
|
+
*
|
|
53
|
+
* @throws Error if token is invalid or expired
|
|
54
|
+
*/
|
|
55
|
+
verifyToken(token: string): TokenPayload;
|
|
56
|
+
/**
|
|
57
|
+
* Creates an access/refresh token pair for a user
|
|
58
|
+
*
|
|
59
|
+
* @param user - The user to create tokens for
|
|
60
|
+
* @param additionalClaims - Custom claims to include (cannot override reserved claims)
|
|
61
|
+
* @throws Error if additionalClaims contains reserved JWT claims
|
|
62
|
+
*/
|
|
63
|
+
createTokenPair(user: User, additionalClaims?: Record<string, unknown>): TokenPair;
|
|
64
|
+
/**
|
|
65
|
+
* Refreshes tokens using a valid refresh token
|
|
66
|
+
*
|
|
67
|
+
* @throws Error if refresh token is invalid or not a refresh token
|
|
68
|
+
*/
|
|
69
|
+
refreshTokens(refreshToken: string, userLoader?: (userId: string) => Promise<User | null>): Promise<TokenPair>;
|
|
70
|
+
refreshTokens(refreshToken: string): TokenPair;
|
|
71
|
+
/**
|
|
72
|
+
* Decodes a token without verification
|
|
73
|
+
* Useful for extracting payload from expired tokens
|
|
74
|
+
*/
|
|
75
|
+
decodeToken(token: string): TokenPayload | null;
|
|
76
|
+
/**
|
|
77
|
+
* Extracts token from Authorization header
|
|
78
|
+
* Supports 'Bearer <token>' format
|
|
79
|
+
*/
|
|
80
|
+
extractFromHeader(authHeader: string | undefined): string | null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new JWT manager instance
|
|
84
|
+
*/
|
|
85
|
+
export declare function createJwtManager(config: JwtConfig): JwtManager;
|
|
86
|
+
/**
|
|
87
|
+
* Token store interface for revocation management
|
|
88
|
+
*/
|
|
89
|
+
export interface TokenStore {
|
|
90
|
+
/** Revoke a token by its ID (jti) */
|
|
91
|
+
revoke: (tokenId: string) => void | Promise<void>;
|
|
92
|
+
/** Check if a token is revoked */
|
|
93
|
+
isRevoked: (tokenId: string) => boolean | Promise<boolean>;
|
|
94
|
+
/** Clear all revoked tokens (useful for testing) */
|
|
95
|
+
clear: () => void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Creates an in-memory token store for development and testing
|
|
99
|
+
*
|
|
100
|
+
* ⚠️ WARNING: NOT suitable for production!
|
|
101
|
+
* - Does not persist across server restarts
|
|
102
|
+
* - Does not work across multiple server instances
|
|
103
|
+
* - No automatic cleanup of expired token IDs
|
|
104
|
+
*
|
|
105
|
+
* For production, use Redis or database-backed storage:
|
|
106
|
+
* - upstash/redis for serverless
|
|
107
|
+
* - ioredis for traditional servers
|
|
108
|
+
* - Database table for audit trail
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* // Development/Testing
|
|
113
|
+
* const tokenStore = createInMemoryTokenStore();
|
|
114
|
+
*
|
|
115
|
+
* const authConfig: AuthConfig = {
|
|
116
|
+
* jwt: { secret: process.env.JWT_SECRET! },
|
|
117
|
+
* isTokenRevoked: tokenStore.isRevoked,
|
|
118
|
+
* };
|
|
119
|
+
*
|
|
120
|
+
* // Revoke on logout
|
|
121
|
+
* app.post('/logout', async (req) => {
|
|
122
|
+
* const tokenId = req.auth.token.jti;
|
|
123
|
+
* tokenStore.revoke(tokenId);
|
|
124
|
+
* });
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function createInMemoryTokenStore(): TokenStore;
|
|
128
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAuC3E;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBvD;AA4BD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGX;gBAEA,MAAM,EAAE,SAAS;IAyB7B;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG;QAC3C,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;KAC5B,EACD,SAAS,EAAE,MAAM,GAChB,MAAM;IAsBT;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAkFxC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IA0ClF;;;;OAIG;IACH,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GACpD,OAAO,CAAC,SAAS,CAAC;IACrB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IA8B9C;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa/C;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAYjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAE9D;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kCAAkC;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAYrD"}
|