@arikajs/auth 0.0.4 → 0.0.6

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 (148) hide show
  1. package/README.md +175 -53
  2. package/dist/AuthContext.d.ts +24 -0
  3. package/dist/AuthContext.d.ts.map +1 -0
  4. package/dist/AuthContext.js +65 -0
  5. package/dist/AuthContext.js.map +1 -0
  6. package/dist/AuthManager.d.ts +33 -8
  7. package/dist/AuthManager.d.ts.map +1 -1
  8. package/dist/AuthManager.js +194 -51
  9. package/dist/AuthManager.js.map +1 -1
  10. package/dist/Contracts/CanResetPassword.d.ts +11 -0
  11. package/dist/Contracts/CanResetPassword.d.ts.map +1 -0
  12. package/dist/Contracts/CanResetPassword.js +3 -0
  13. package/dist/Contracts/CanResetPassword.js.map +1 -0
  14. package/dist/Contracts/CanVerifyEmail.d.ts +19 -0
  15. package/dist/Contracts/CanVerifyEmail.d.ts.map +1 -0
  16. package/dist/Contracts/CanVerifyEmail.js +3 -0
  17. package/dist/Contracts/CanVerifyEmail.js.map +1 -0
  18. package/dist/Contracts/EventDispatcher.d.ts +7 -0
  19. package/dist/Contracts/EventDispatcher.d.ts.map +1 -0
  20. package/dist/Contracts/EventDispatcher.js +3 -0
  21. package/dist/Contracts/EventDispatcher.js.map +1 -0
  22. package/dist/Contracts/PasswordBroker.d.ts +18 -0
  23. package/dist/Contracts/PasswordBroker.d.ts.map +1 -0
  24. package/dist/Contracts/PasswordBroker.js +11 -0
  25. package/dist/Contracts/PasswordBroker.js.map +1 -0
  26. package/dist/Contracts/RateLimiter.d.ts +15 -0
  27. package/dist/Contracts/RateLimiter.d.ts.map +1 -0
  28. package/dist/Contracts/RateLimiter.js +3 -0
  29. package/dist/Contracts/RateLimiter.js.map +1 -0
  30. package/dist/Contracts/UserProvider.d.ts +4 -0
  31. package/dist/Contracts/UserProvider.d.ts.map +1 -1
  32. package/dist/Guards/BasicGuard.d.ts +17 -0
  33. package/dist/Guards/BasicGuard.d.ts.map +1 -0
  34. package/dist/Guards/BasicGuard.js +59 -0
  35. package/dist/Guards/BasicGuard.js.map +1 -0
  36. package/dist/Guards/JwtGuard.d.ts +36 -0
  37. package/dist/Guards/JwtGuard.d.ts.map +1 -0
  38. package/dist/Guards/JwtGuard.js +158 -0
  39. package/dist/Guards/JwtGuard.js.map +1 -0
  40. package/dist/Guards/SessionGuard.d.ts +7 -3
  41. package/dist/Guards/SessionGuard.d.ts.map +1 -1
  42. package/dist/Guards/SessionGuard.js +104 -10
  43. package/dist/Guards/SessionGuard.js.map +1 -1
  44. package/dist/Hasher.d.ts +4 -0
  45. package/dist/Hasher.d.ts.map +1 -1
  46. package/dist/Hasher.js +6 -0
  47. package/dist/Hasher.js.map +1 -1
  48. package/dist/Middleware/Authenticate.d.ts +11 -2
  49. package/dist/Middleware/Authenticate.d.ts.map +1 -1
  50. package/dist/Middleware/Authenticate.js +42 -14
  51. package/dist/Middleware/Authenticate.js.map +1 -1
  52. package/dist/Middleware/EnsureEmailIsVerified.d.ts +8 -0
  53. package/dist/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
  54. package/dist/Middleware/EnsureEmailIsVerified.js +27 -0
  55. package/dist/Middleware/EnsureEmailIsVerified.js.map +1 -0
  56. package/dist/Passwords/PasswordResetBroker.d.ts +37 -0
  57. package/dist/Passwords/PasswordResetBroker.d.ts.map +1 -0
  58. package/dist/Passwords/PasswordResetBroker.js +128 -0
  59. package/dist/Passwords/PasswordResetBroker.js.map +1 -0
  60. package/dist/Providers/EloquentUserProvider.d.ts +30 -0
  61. package/dist/Providers/EloquentUserProvider.d.ts.map +1 -0
  62. package/dist/Providers/EloquentUserProvider.js +63 -0
  63. package/dist/Providers/EloquentUserProvider.js.map +1 -0
  64. package/dist/index.d.ts +11 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +11 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/src/AuthContext.d.ts +24 -0
  69. package/dist/src/AuthContext.d.ts.map +1 -0
  70. package/dist/src/AuthContext.js +65 -0
  71. package/dist/src/AuthContext.js.map +1 -0
  72. package/dist/src/AuthManager.d.ts +52 -0
  73. package/dist/src/AuthManager.d.ts.map +1 -0
  74. package/dist/src/AuthManager.js +255 -0
  75. package/dist/src/AuthManager.js.map +1 -0
  76. package/dist/src/Contracts/CanResetPassword.d.ts +11 -0
  77. package/dist/src/Contracts/CanResetPassword.d.ts.map +1 -0
  78. package/dist/src/Contracts/CanResetPassword.js +3 -0
  79. package/dist/src/Contracts/CanResetPassword.js.map +1 -0
  80. package/dist/src/Contracts/CanVerifyEmail.d.ts +19 -0
  81. package/dist/src/Contracts/CanVerifyEmail.d.ts.map +1 -0
  82. package/dist/src/Contracts/CanVerifyEmail.js +3 -0
  83. package/dist/src/Contracts/CanVerifyEmail.js.map +1 -0
  84. package/dist/src/Contracts/EventDispatcher.d.ts +7 -0
  85. package/dist/src/Contracts/EventDispatcher.d.ts.map +1 -0
  86. package/dist/src/Contracts/EventDispatcher.js +3 -0
  87. package/dist/src/Contracts/EventDispatcher.js.map +1 -0
  88. package/dist/src/Contracts/PasswordBroker.d.ts +18 -0
  89. package/dist/src/Contracts/PasswordBroker.d.ts.map +1 -0
  90. package/dist/src/Contracts/PasswordBroker.js +11 -0
  91. package/dist/src/Contracts/PasswordBroker.js.map +1 -0
  92. package/dist/src/Contracts/RateLimiter.d.ts +15 -0
  93. package/dist/src/Contracts/RateLimiter.d.ts.map +1 -0
  94. package/dist/src/Contracts/RateLimiter.js +3 -0
  95. package/dist/src/Contracts/RateLimiter.js.map +1 -0
  96. package/dist/src/Contracts/UserProvider.d.ts +10 -0
  97. package/dist/src/Contracts/UserProvider.d.ts.map +1 -0
  98. package/dist/src/Contracts/UserProvider.js +3 -0
  99. package/dist/src/Contracts/UserProvider.js.map +1 -0
  100. package/dist/src/Guard.d.ts +10 -0
  101. package/dist/src/Guard.d.ts.map +1 -0
  102. package/dist/src/Guard.js +3 -0
  103. package/dist/src/Guard.js.map +1 -0
  104. package/dist/src/Guards/BasicGuard.d.ts +17 -0
  105. package/dist/src/Guards/BasicGuard.d.ts.map +1 -0
  106. package/dist/src/Guards/BasicGuard.js +59 -0
  107. package/dist/src/Guards/BasicGuard.js.map +1 -0
  108. package/dist/src/Guards/JwtGuard.d.ts +36 -0
  109. package/dist/src/Guards/JwtGuard.d.ts.map +1 -0
  110. package/dist/src/Guards/JwtGuard.js +158 -0
  111. package/dist/src/Guards/JwtGuard.js.map +1 -0
  112. package/dist/src/Guards/SessionGuard.d.ts +23 -0
  113. package/dist/src/Guards/SessionGuard.d.ts.map +1 -0
  114. package/dist/src/Guards/SessionGuard.js +162 -0
  115. package/dist/src/Guards/SessionGuard.js.map +1 -0
  116. package/dist/src/Guards/TokenGuard.d.ts +17 -0
  117. package/dist/src/Guards/TokenGuard.d.ts.map +1 -0
  118. package/dist/src/Guards/TokenGuard.js +60 -0
  119. package/dist/src/Guards/TokenGuard.js.map +1 -0
  120. package/dist/src/Hasher.d.ts +15 -0
  121. package/dist/src/Hasher.d.ts.map +1 -0
  122. package/dist/src/Hasher.js +59 -0
  123. package/dist/src/Hasher.js.map +1 -0
  124. package/dist/src/Middleware/Authenticate.d.ts +24 -0
  125. package/dist/src/Middleware/Authenticate.d.ts.map +1 -0
  126. package/dist/src/Middleware/Authenticate.js +66 -0
  127. package/dist/src/Middleware/Authenticate.js.map +1 -0
  128. package/dist/src/Middleware/EnsureEmailIsVerified.d.ts +8 -0
  129. package/dist/src/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
  130. package/dist/src/Middleware/EnsureEmailIsVerified.js +27 -0
  131. package/dist/src/Middleware/EnsureEmailIsVerified.js.map +1 -0
  132. package/dist/src/Passwords/PasswordResetBroker.d.ts +37 -0
  133. package/dist/src/Passwords/PasswordResetBroker.d.ts.map +1 -0
  134. package/dist/src/Passwords/PasswordResetBroker.js +128 -0
  135. package/dist/src/Passwords/PasswordResetBroker.js.map +1 -0
  136. package/dist/src/Providers/EloquentUserProvider.d.ts +30 -0
  137. package/dist/src/Providers/EloquentUserProvider.d.ts.map +1 -0
  138. package/dist/src/Providers/EloquentUserProvider.js +63 -0
  139. package/dist/src/Providers/EloquentUserProvider.js.map +1 -0
  140. package/dist/src/index.d.ts +19 -0
  141. package/dist/src/index.d.ts.map +1 -0
  142. package/dist/src/index.js +35 -0
  143. package/dist/src/index.js.map +1 -0
  144. package/dist/tests/Auth.test.d.ts +2 -0
  145. package/dist/tests/Auth.test.d.ts.map +1 -0
  146. package/dist/tests/Auth.test.js +177 -0
  147. package/dist/tests/Auth.test.js.map +1 -0
  148. package/package.json +51 -47
package/README.md CHANGED
@@ -7,9 +7,8 @@ It enables applications to authenticate users using session-based (web) or token
7
7
  ```ts
8
8
  import { AuthManager } from '@arikajs/auth';
9
9
 
10
- if (await auth.attempt({ email, password })) {
11
- const user = auth.user();
12
- }
10
+ // Per-request scoped safe for concurrent requests
11
+ const user = await req.auth.user();
13
12
  ```
14
13
 
15
14
  ---
@@ -63,18 +62,26 @@ This package is responsible for:
63
62
 
64
63
  ## Features
65
64
 
65
+ - **Request-scoped auth context**
66
+ - Memory-safe, per-request isolation via `req.auth` — no leaks under concurrency.
66
67
  - **Multiple authentication guards**
67
- - Configure different strategies for API vs Web.
68
- - **Session-based authentication**
69
- - Secure defaults for browser-based apps.
70
- - **Token-based authentication**
71
- - Simple API token validation.
68
+ - Configure different strategies for API vs Web (Session, JWT, Token, Basic).
69
+ - **Stateless JWT with Refresh Tokens**
70
+ - Short-lived access tokens + rotating refresh tokens for modern APIs.
71
+ - **"Remember Me" support**
72
+ - Persistent login across browser restarts with secure cookie rotation.
73
+ - **Email verification system**
74
+ - Verify user emails with a simple API and `verified` middleware.
75
+ - **Password reset flow**
76
+ - Token-based resets with expiry and hash-secured storage.
77
+ - **Account locking & throttling**
78
+ - Soft lock after N failures, auto-unlock, manual unlock.
79
+ - **Auth event dispatching**
80
+ - Hook into `Auth.Login`, `Auth.Failed`, `Auth.Lockout`, etc.
72
81
  - **Pluggable user providers**
73
82
  - Connect to any database or ORM.
74
83
  - **Secure password hashing**
75
84
  - Industry-standard hashing algorithms (Bcrypt/Argon2).
76
- - **Middleware-based protection**
77
- - Easily secure routes.
78
85
 
79
86
  ---
80
87
 
@@ -95,13 +102,13 @@ pnpm add @arikajs/auth
95
102
  ```
96
103
  Request
97
104
 
98
- Authenticate Middleware
105
+ Authenticate Middleware ← creates req.auth (AuthContext)
99
106
 
100
- Auth Guard
107
+ AuthContext Guard (Session / JWT / Token / Basic)
101
108
 
102
109
  User Provider
103
110
 
104
- Authenticated User (or null)
111
+ Authenticated User (or reject)
105
112
  ```
106
113
 
107
114
  ---
@@ -114,8 +121,10 @@ Guards define how users are authenticated.
114
121
 
115
122
  | Guard | Description |
116
123
  | :--- | :--- |
117
- | `session` | Cookie/session-based authentication |
124
+ | `session` | Cookie/session-based authentication with "Remember Me" support |
125
+ | `jwt` | Stateless API authentication using JSON Web Tokens (JWT) |
118
126
  | `token` | Header-based token authentication |
127
+ | `basic` | HTTP Basic Authentication support |
119
128
 
120
129
  ---
121
130
 
@@ -126,8 +135,12 @@ User providers define how users are retrieved.
126
135
  ```ts
127
136
  export interface UserProvider {
128
137
  retrieveById(id: string | number): Promise<any>;
129
- retrieveByCredentials(credentials: object): Promise<any>;
130
- validateCredentials(user: any, credentials: object): boolean;
138
+ retrieveByToken?(id: string | number, token: string): Promise<any>;
139
+ updateRememberToken?(user: any, token: string | null): Promise<void>;
140
+ updateRefreshToken?(user: any, token: string | null): Promise<void>;
141
+ retrieveByRefreshToken?(token: string): Promise<any>;
142
+ retrieveByCredentials(credentials: Record<string, any>): Promise<any>;
143
+ validateCredentials(user: any, credentials: Record<string, any>): boolean | Promise<boolean>;
131
144
  }
132
145
  ```
133
146
 
@@ -137,23 +150,27 @@ Providers allow you to integrate any database or user store.
137
150
 
138
151
  ## 🔌 Basic Usage
139
152
 
140
- ### Checking Authentication State
153
+ ### Checking Authentication State (per-request)
141
154
 
142
155
  ```ts
143
- import { auth } from '@arikajs/auth';
144
-
145
- if (auth.check()) {
146
- const user = auth.user();
156
+ // In your controller — req.auth is automatically bound by the Authenticate middleware
157
+ if (await req.auth.check()) {
158
+ const user = await req.auth.user();
147
159
  }
160
+
161
+ // Or via the global facade (backed by AsyncLocalStorage):
162
+ import { auth } from '@arikajs/auth';
163
+ const user = await auth.user();
148
164
  ```
149
165
 
150
166
  ### Attempting Login
151
167
 
152
168
  ```ts
169
+ // The second parameter `true` enables "Remember Me"
153
170
  const success = await auth.attempt({
154
171
  email: 'test@example.com',
155
172
  password: 'secret',
156
- });
173
+ }, true);
157
174
 
158
175
  if (!success) {
159
176
  throw new Error('Invalid credentials');
@@ -163,7 +180,7 @@ if (!success) {
163
180
  ### Logging Out
164
181
 
165
182
  ```ts
166
- auth.logout();
183
+ await auth.logout();
167
184
  ```
168
185
 
169
186
  ---
@@ -181,27 +198,117 @@ Route.get('/dashboard', handler)
181
198
 
182
199
  ```ts
183
200
  Route.get('/api/user', handler)
184
- .middleware(['auth:token']);
201
+ .middleware(['auth:jwt']); // or auth:token, auth:basic
202
+ ```
203
+
204
+ ---
205
+
206
+ ## 🚀 Advanced Features
207
+
208
+ ### 🔒 Request-Scoped Auth Context (Critical for Concurrency)
209
+ Every incoming request gets its own isolated `AuthContext`. No shared mutable state, no memory leaks under concurrent load.
210
+ ```ts
211
+ // The Authenticate middleware does this automatically:
212
+ const context = authManager.createContext(request);
213
+ // Now: req.auth.user(), req.auth.check(), req.auth.attempt() are all request-scoped
214
+ ```
215
+
216
+ ### 🔑 Stateless JWT with Refresh Tokens
217
+ Short-lived access tokens + secure refresh token rotation for modern API architectures:
218
+ ```ts
219
+ // Login returns both tokens
220
+ const result = await req.auth.guard('jwt').attempt({ email, password });
221
+ // result = { access_token: 'eyJhbG...', refresh_token: '9f3a7b...' }
222
+
223
+ // Refresh when the access token expires
224
+ const newTokens = await jwtGuard.refresh(oldRefreshToken);
225
+ // Returns rotated access + refresh tokens
226
+ ```
227
+
228
+ ### 🍪 "Remember Me" Capability
229
+ Keep users logged in seamlessly across browser restarts using long-lived secure cookies.
230
+ ```ts
231
+ await req.auth.attempt(credentials, true); // true = remember me
232
+ ```
233
+
234
+ ### ✉️ Email Verification System
235
+ Verify user emails with a simple API and protect routes that require verification:
236
+ ```ts
237
+ // Send verification email
238
+ await req.auth.sendVerification(user);
239
+
240
+ // Protect routes requiring email verification
241
+ Route.get('/billing', handler)
242
+ .middleware(['auth', 'verified']);
243
+ ```
244
+
245
+ ### 🔐 Password Reset Flow
246
+ Full token-based password reset with expiry and hash-secured storage:
247
+ ```ts
248
+ import { PasswordResetBroker } from '@arikajs/auth';
249
+
250
+ const broker = new PasswordResetBroker(userProvider);
251
+
252
+ // Send reset link
253
+ const status = await broker.sendResetLink({ email: 'user@example.com' });
254
+
255
+ // Reset password with token
256
+ const result = await broker.reset(
257
+ { email, token, password: newPassword },
258
+ async (user, password) => {
259
+ user.password = await Hasher.make(password);
260
+ await user.save();
261
+ }
262
+ );
263
+ ```
264
+
265
+ ### 🛡️ Account Locking Strategy
266
+ Soft lock accounts after too many failed attempts. Auto-unlock after configured duration. Manual unlock for admins.
267
+ ```ts
268
+ // Check if account is locked
269
+ const locked = await req.auth.isLocked({ email });
270
+
271
+ // Manually unlock (e.g., admin action)
272
+ await req.auth.unlockAccount({ email });
273
+
274
+ // Configuration:
275
+ // { lockout: { maxAttempts: 5, decayMinutes: 15 } }
276
+ ```
277
+
278
+ ### 🛡️ Login Throttling (Rate Limiting)
279
+ ArikaJS Auth automatically integrates with RateLimiters to protect against brute-force attacks!
280
+ ```ts
281
+ authManager.setRateLimiter(new RedisRateLimiter());
185
282
  ```
186
283
 
284
+ ### 📡 Event Dispatching
285
+ ArikaJS fires core auth events so you can hook into the lifecycle:
286
+ - `Auth.Attempting` — login attempt started
287
+ - `Auth.Login` — successful login
288
+ - `Auth.Failed` — failed login attempt
289
+ - `Auth.Logout` — user logged out
290
+ - `Auth.Lockout` — account locked due to too many failures
291
+ - `Auth.VerificationSent` — verification email dispatched
292
+ - `Auth.AccountUnlocked` — account manually unlocked
293
+
187
294
  ---
188
295
 
189
296
  ## ⚙️ Configuration
190
297
 
191
298
  Example configuration:
192
299
 
193
- ```json
300
+ ```ts
194
301
  {
195
- "default": "session",
196
- "guards": {
197
- "session": {
198
- "driver": "session",
199
- "provider": "users"
200
- },
201
- "token": {
202
- "driver": "token",
203
- "provider": "users"
204
- }
302
+ default: 'session',
303
+ guards: {
304
+ session: { driver: 'session', provider: 'users' },
305
+ jwt: { driver: 'jwt', provider: 'users', secret: 'your-jwt-secret', options: { expiresIn: '15m' } },
306
+ token: { driver: 'token', provider: 'users' },
307
+ basic: { driver: 'basic', provider: 'users' }
308
+ },
309
+ lockout: {
310
+ maxAttempts: 5,
311
+ decayMinutes: 15
205
312
  }
206
313
  }
207
314
  ```
@@ -221,23 +328,38 @@ Uses industry-standard hashing algorithms.
221
328
 
222
329
  ---
223
330
 
224
- ## 🧱 Project Structure
225
-
226
- - `src/`
227
- - `AuthManager.ts` – Main entry point
228
- - `Guard.ts` – Guard interface
229
- - `Guards/` – Implementations
230
- - `SessionGuard.ts`, `TokenGuard.ts`
231
- - `Hasher.ts` – Password hashing utility
232
- - `Middleware/` – Auth middleware
233
- - `Authenticate.ts`
234
- - `Contracts/` – Interfaces
235
- - `UserProvider.ts`
236
- - `index.ts` – Public exports
237
- - `package.json`
238
- - `tsconfig.json`
239
- - `README.md`
240
- - `LICENSE`
331
+ ## 🏗 Architecture
332
+
333
+ ```text
334
+ auth/
335
+ ├── src/
336
+ │ ├── Contracts
337
+ │ │ ├── CanResetPassword.ts
338
+ │ │ ├── CanVerifyEmail.ts
339
+ │ │ ├── EventDispatcher.ts
340
+ │ │ ├── PasswordBroker.ts
341
+ │ │ ├── RateLimiter.ts
342
+ │ │ └── UserProvider.ts
343
+ │ ├── Guards
344
+ │ │ ├── BasicGuard.ts
345
+ │ │ ├── JwtGuard.ts
346
+ │ │ ├── SessionGuard.ts
347
+ │ │ └── TokenGuard.ts
348
+ │ ├── Middleware
349
+ │ │ ├── Authenticate.ts
350
+ │ │ └── EnsureEmailIsVerified.ts
351
+ │ ├── Passwords
352
+ │ │ └── PasswordResetBroker.ts
353
+ │ ├── AuthContext.ts
354
+ │ ├── AuthManager.ts
355
+ │ ├── Guard.ts
356
+ │ ├── Hasher.ts
357
+ │ └── index.ts
358
+ ├── tests/
359
+ ├── package.json
360
+ ├── tsconfig.json
361
+ └── README.md
362
+ ```
241
363
 
242
364
  ---
243
365
 
@@ -257,4 +379,4 @@ Uses industry-standard hashing algorithms.
257
379
 
258
380
  ## 🧠 Philosophy
259
381
 
260
- > “Authentication identifies the user. Authorization defines their power.”
382
+ > “Authentication identifies the user. Authorization defines their power.”
@@ -0,0 +1,24 @@
1
+ import { Guard } from './Guard';
2
+ import { AuthManager } from './AuthManager';
3
+ export declare class AuthContext {
4
+ private guards;
5
+ private request;
6
+ private manager;
7
+ constructor(manager: AuthManager, request: any);
8
+ guard(name?: string): Guard;
9
+ check(): Promise<boolean>;
10
+ guest(): Promise<boolean>;
11
+ user(): Promise<any>;
12
+ id(): Promise<string | number | null>;
13
+ validate(credentials: Record<string, any>): Promise<boolean>;
14
+ setUser(user: any): void;
15
+ attempt(credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
16
+ login(user: any, remember?: boolean): Promise<void>;
17
+ logout(): Promise<void>;
18
+ sendVerification(user?: any): Promise<void>;
19
+ isLocked(credentials: Record<string, any>): Promise<boolean>;
20
+ unlockAccount(credentials: Record<string, any>): Promise<void>;
21
+ getRequest(): any;
22
+ resolve(token: any): any;
23
+ }
24
+ //# sourceMappingURL=AuthContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG;IAKvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;IAerB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAIpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAIrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,UAAU,IAAI,GAAG;IAIjB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAGlC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthContext = void 0;
4
+ class AuthContext {
5
+ constructor(manager, request) {
6
+ this.guards = new Map();
7
+ this.manager = manager;
8
+ this.request = request;
9
+ }
10
+ guard(name) {
11
+ name = name || this.manager.getDefaultGuard();
12
+ if (!name) {
13
+ throw new Error('No auth guard defined.');
14
+ }
15
+ if (!this.guards.has(name)) {
16
+ this.guards.set(name, this.manager.resolveGuard(name, this.request));
17
+ }
18
+ return this.guards.get(name);
19
+ }
20
+ // Proxy methods to the default guard
21
+ async check() {
22
+ return await this.guard().check();
23
+ }
24
+ async guest() {
25
+ return await this.guard().guest();
26
+ }
27
+ async user() {
28
+ return await this.guard().user();
29
+ }
30
+ async id() {
31
+ return await this.guard().id();
32
+ }
33
+ async validate(credentials) {
34
+ return await this.guard().validate(credentials);
35
+ }
36
+ setUser(user) {
37
+ this.guard().setUser(user);
38
+ }
39
+ async attempt(credentials, remember = false) {
40
+ return await this.manager.attemptForContext(this, credentials, remember);
41
+ }
42
+ async login(user, remember = false) {
43
+ return await this.manager.loginForContext(this, user, remember);
44
+ }
45
+ async logout() {
46
+ return await this.manager.logoutForContext(this);
47
+ }
48
+ async sendVerification(user) {
49
+ return await this.manager.sendVerification(this, user);
50
+ }
51
+ async isLocked(credentials) {
52
+ return await this.manager.isLocked(this, credentials);
53
+ }
54
+ async unlockAccount(credentials) {
55
+ return await this.manager.unlockAccount(this, credentials);
56
+ }
57
+ getRequest() {
58
+ return this.request;
59
+ }
60
+ resolve(token) {
61
+ return this.guard(token);
62
+ }
63
+ }
64
+ exports.AuthContext = AuthContext;
65
+ //# sourceMappingURL=AuthContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthContext.js","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAKpB,YAAY,OAAoB,EAAE,OAAY;QAJtC,WAAM,GAAuB,IAAI,GAAG,EAAE,CAAC;QAK3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,IAAa;QACtB,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAClC,CAAC;IAED,qCAAqC;IAC9B,KAAK,CAAC,KAAK;QACd,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,IAAI;QACb,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,EAAE;QACX,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAgC;QAClD,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAEM,OAAO,CAAC,IAAS;QACpB,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,WAAgC,EAAE,WAAoB,KAAK;QAC5E,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAS,EAAE,WAAoB,KAAK;QACnD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,IAAU;QACpC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAgC;QAClD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,WAAgC;QACvD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;IAEM,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEM,OAAO,CAAC,KAAU;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;IACvC,CAAC;CACJ;AAhFD,kCAgFC"}
@@ -1,27 +1,52 @@
1
1
  import { Guard } from './Guard';
2
2
  import { UserProvider } from './Contracts/UserProvider';
3
+ import { EventDispatcher } from './Contracts/EventDispatcher';
4
+ import { RateLimiter } from './Contracts/RateLimiter';
5
+ import { AuthContext } from './AuthContext';
3
6
  export declare class AuthManager {
4
- private guards;
5
7
  private providers;
8
+ private eventDispatcher;
9
+ private rateLimiter;
6
10
  private config;
11
+ private defaultGuard;
12
+ private als;
7
13
  constructor(config: any);
14
+ setEventDispatcher(dispatcher: EventDispatcher): void;
15
+ setRateLimiter(limiter: RateLimiter): void;
8
16
  registerProvider(name: string, provider: UserProvider): void;
9
17
  extend(name: string, callback: (app: any) => Guard): void;
10
- guard(name?: string): Guard;
11
- private resolveGuard;
12
- private currentRequest;
13
- setRequest(request: any): void;
18
+ getDefaultGuard(): string;
19
+ createContext(request: any): AuthContext;
20
+ resolveGuard(name: string, request: any): Guard;
14
21
  private createSessionDriver;
15
22
  private createTokenDriver;
23
+ private createJwtDriver;
24
+ private createBasicDriver;
25
+ private getProvider;
16
26
  shouldUse(name: string): void;
27
+ runWithContext<T>(context: AuthContext, fn: () => T | Promise<T>): T | Promise<T>;
28
+ private getContext;
29
+ guard(name?: string): Guard;
30
+ resolve(token: any): any;
17
31
  check(): Promise<boolean>;
18
32
  guest(): Promise<boolean>;
19
33
  user(): Promise<any>;
20
34
  id(): Promise<string | number | null>;
21
35
  validate(credentials: Record<string, any>): Promise<boolean>;
22
36
  setUser(user: any): void;
23
- attempt(credentials: Record<string, any>): Promise<boolean>;
24
- login(user: any): void;
25
- logout(): void;
37
+ attempt(credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
38
+ login(user: any, remember?: boolean): Promise<void>;
39
+ logout(): Promise<void>;
40
+ attemptForContext(context: AuthContext, credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
41
+ loginForContext(context: AuthContext, user: any, remember?: boolean): Promise<void>;
42
+ logoutForContext(context: AuthContext): Promise<void>;
43
+ sendVerification(context: AuthContext, user?: any): Promise<void>;
44
+ private get lockoutThreshold();
45
+ private get lockoutDuration();
46
+ isLocked(context: AuthContext, credentials: Record<string, any>): Promise<boolean>;
47
+ unlockAccount(context: AuthContext, credentials: Record<string, any>): Promise<void>;
48
+ private getLockKey;
49
+ private fireEvent;
50
+ private getThrottleKey;
26
51
  }
27
52
  //# sourceMappingURL=AuthManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,GAAG;IAIhB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,GAAG,IAAI;IAIzD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;IAelC,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,cAAc,CAAW;IAE1B,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IASrC,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAQlB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAIpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAIrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjE,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAStB,MAAM,IAAI,IAAI;CAQxB"}
1
+ {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,qBAAa,WAAW;IACpB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,GAAG,CAAwC;gBAEvC,MAAM,EAAE,GAAG;IAKhB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIrD,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI1C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,GAAG,IAAI;IAIzD,eAAe,IAAI,MAAM;IAIzB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW;IAWxC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,KAAK;IA0BtD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,WAAW;IAqBZ,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxF,OAAO,CAAC,UAAU;IASX,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;IAI3B,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAIlB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAIpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAIrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAqC/H,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1F,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9E,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,eAAe,GAE1B;IAEY,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IASlF,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjG,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;CAOzB"}