@arikajs/auth 0.0.4 → 0.0.5
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 +175 -53
- package/dist/AuthContext.d.ts +24 -0
- package/dist/AuthContext.d.ts.map +1 -0
- package/dist/AuthContext.js +65 -0
- package/dist/AuthContext.js.map +1 -0
- package/dist/AuthManager.d.ts +33 -8
- package/dist/AuthManager.d.ts.map +1 -1
- package/dist/AuthManager.js +194 -51
- package/dist/AuthManager.js.map +1 -1
- package/dist/Contracts/CanResetPassword.d.ts +11 -0
- package/dist/Contracts/CanResetPassword.d.ts.map +1 -0
- package/dist/Contracts/CanResetPassword.js +3 -0
- package/dist/Contracts/CanResetPassword.js.map +1 -0
- package/dist/Contracts/CanVerifyEmail.d.ts +19 -0
- package/dist/Contracts/CanVerifyEmail.d.ts.map +1 -0
- package/dist/Contracts/CanVerifyEmail.js +3 -0
- package/dist/Contracts/CanVerifyEmail.js.map +1 -0
- package/dist/Contracts/EventDispatcher.d.ts +7 -0
- package/dist/Contracts/EventDispatcher.d.ts.map +1 -0
- package/dist/Contracts/EventDispatcher.js +3 -0
- package/dist/Contracts/EventDispatcher.js.map +1 -0
- package/dist/Contracts/PasswordBroker.d.ts +18 -0
- package/dist/Contracts/PasswordBroker.d.ts.map +1 -0
- package/dist/Contracts/PasswordBroker.js +11 -0
- package/dist/Contracts/PasswordBroker.js.map +1 -0
- package/dist/Contracts/RateLimiter.d.ts +15 -0
- package/dist/Contracts/RateLimiter.d.ts.map +1 -0
- package/dist/Contracts/RateLimiter.js +3 -0
- package/dist/Contracts/RateLimiter.js.map +1 -0
- package/dist/Contracts/UserProvider.d.ts +4 -0
- package/dist/Contracts/UserProvider.d.ts.map +1 -1
- package/dist/Guards/BasicGuard.d.ts +17 -0
- package/dist/Guards/BasicGuard.d.ts.map +1 -0
- package/dist/Guards/BasicGuard.js +59 -0
- package/dist/Guards/BasicGuard.js.map +1 -0
- package/dist/Guards/JwtGuard.d.ts +36 -0
- package/dist/Guards/JwtGuard.d.ts.map +1 -0
- package/dist/Guards/JwtGuard.js +158 -0
- package/dist/Guards/JwtGuard.js.map +1 -0
- package/dist/Guards/SessionGuard.d.ts +7 -3
- package/dist/Guards/SessionGuard.d.ts.map +1 -1
- package/dist/Guards/SessionGuard.js +104 -10
- package/dist/Guards/SessionGuard.js.map +1 -1
- package/dist/Hasher.d.ts +4 -0
- package/dist/Hasher.d.ts.map +1 -1
- package/dist/Hasher.js +6 -0
- package/dist/Hasher.js.map +1 -1
- package/dist/Middleware/Authenticate.d.ts +11 -2
- package/dist/Middleware/Authenticate.d.ts.map +1 -1
- package/dist/Middleware/Authenticate.js +42 -14
- package/dist/Middleware/Authenticate.js.map +1 -1
- package/dist/Middleware/EnsureEmailIsVerified.d.ts +8 -0
- package/dist/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
- package/dist/Middleware/EnsureEmailIsVerified.js +27 -0
- package/dist/Middleware/EnsureEmailIsVerified.js.map +1 -0
- package/dist/Passwords/PasswordResetBroker.d.ts +37 -0
- package/dist/Passwords/PasswordResetBroker.d.ts.map +1 -0
- package/dist/Passwords/PasswordResetBroker.js +128 -0
- package/dist/Passwords/PasswordResetBroker.js.map +1 -0
- package/dist/Providers/EloquentUserProvider.d.ts +30 -0
- package/dist/Providers/EloquentUserProvider.d.ts.map +1 -0
- package/dist/Providers/EloquentUserProvider.js +63 -0
- package/dist/Providers/EloquentUserProvider.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/src/AuthContext.d.ts +24 -0
- package/dist/src/AuthContext.d.ts.map +1 -0
- package/dist/src/AuthContext.js +65 -0
- package/dist/src/AuthContext.js.map +1 -0
- package/dist/src/AuthManager.d.ts +52 -0
- package/dist/src/AuthManager.d.ts.map +1 -0
- package/dist/src/AuthManager.js +255 -0
- package/dist/src/AuthManager.js.map +1 -0
- package/dist/src/Contracts/CanResetPassword.d.ts +11 -0
- package/dist/src/Contracts/CanResetPassword.d.ts.map +1 -0
- package/dist/src/Contracts/CanResetPassword.js +3 -0
- package/dist/src/Contracts/CanResetPassword.js.map +1 -0
- package/dist/src/Contracts/CanVerifyEmail.d.ts +19 -0
- package/dist/src/Contracts/CanVerifyEmail.d.ts.map +1 -0
- package/dist/src/Contracts/CanVerifyEmail.js +3 -0
- package/dist/src/Contracts/CanVerifyEmail.js.map +1 -0
- package/dist/src/Contracts/EventDispatcher.d.ts +7 -0
- package/dist/src/Contracts/EventDispatcher.d.ts.map +1 -0
- package/dist/src/Contracts/EventDispatcher.js +3 -0
- package/dist/src/Contracts/EventDispatcher.js.map +1 -0
- package/dist/src/Contracts/PasswordBroker.d.ts +18 -0
- package/dist/src/Contracts/PasswordBroker.d.ts.map +1 -0
- package/dist/src/Contracts/PasswordBroker.js +11 -0
- package/dist/src/Contracts/PasswordBroker.js.map +1 -0
- package/dist/src/Contracts/RateLimiter.d.ts +15 -0
- package/dist/src/Contracts/RateLimiter.d.ts.map +1 -0
- package/dist/src/Contracts/RateLimiter.js +3 -0
- package/dist/src/Contracts/RateLimiter.js.map +1 -0
- package/dist/src/Contracts/UserProvider.d.ts +10 -0
- package/dist/src/Contracts/UserProvider.d.ts.map +1 -0
- package/dist/src/Contracts/UserProvider.js +3 -0
- package/dist/src/Contracts/UserProvider.js.map +1 -0
- package/dist/src/Guard.d.ts +10 -0
- package/dist/src/Guard.d.ts.map +1 -0
- package/dist/src/Guard.js +3 -0
- package/dist/src/Guard.js.map +1 -0
- package/dist/src/Guards/BasicGuard.d.ts +17 -0
- package/dist/src/Guards/BasicGuard.d.ts.map +1 -0
- package/dist/src/Guards/BasicGuard.js +59 -0
- package/dist/src/Guards/BasicGuard.js.map +1 -0
- package/dist/src/Guards/JwtGuard.d.ts +36 -0
- package/dist/src/Guards/JwtGuard.d.ts.map +1 -0
- package/dist/src/Guards/JwtGuard.js +158 -0
- package/dist/src/Guards/JwtGuard.js.map +1 -0
- package/dist/src/Guards/SessionGuard.d.ts +23 -0
- package/dist/src/Guards/SessionGuard.d.ts.map +1 -0
- package/dist/src/Guards/SessionGuard.js +162 -0
- package/dist/src/Guards/SessionGuard.js.map +1 -0
- package/dist/src/Guards/TokenGuard.d.ts +17 -0
- package/dist/src/Guards/TokenGuard.d.ts.map +1 -0
- package/dist/src/Guards/TokenGuard.js +60 -0
- package/dist/src/Guards/TokenGuard.js.map +1 -0
- package/dist/src/Hasher.d.ts +15 -0
- package/dist/src/Hasher.d.ts.map +1 -0
- package/dist/src/Hasher.js +59 -0
- package/dist/src/Hasher.js.map +1 -0
- package/dist/src/Middleware/Authenticate.d.ts +24 -0
- package/dist/src/Middleware/Authenticate.d.ts.map +1 -0
- package/dist/src/Middleware/Authenticate.js +66 -0
- package/dist/src/Middleware/Authenticate.js.map +1 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.d.ts +8 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.js +27 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.js.map +1 -0
- package/dist/src/Passwords/PasswordResetBroker.d.ts +37 -0
- package/dist/src/Passwords/PasswordResetBroker.d.ts.map +1 -0
- package/dist/src/Passwords/PasswordResetBroker.js +128 -0
- package/dist/src/Passwords/PasswordResetBroker.js.map +1 -0
- package/dist/src/Providers/EloquentUserProvider.d.ts +30 -0
- package/dist/src/Providers/EloquentUserProvider.d.ts.map +1 -0
- package/dist/src/Providers/EloquentUserProvider.js +63 -0
- package/dist/src/Providers/EloquentUserProvider.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +35 -0
- package/dist/src/index.js.map +1 -0
- package/dist/tests/Auth.test.d.ts +2 -0
- package/dist/tests/Auth.test.d.ts.map +1 -0
- package/dist/tests/Auth.test.js +177 -0
- package/dist/tests/Auth.test.js.map +1 -0
- package/package.json +51 -47
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthManager = void 0;
|
|
4
|
+
const SessionGuard_1 = require("./Guards/SessionGuard");
|
|
5
|
+
const TokenGuard_1 = require("./Guards/TokenGuard");
|
|
6
|
+
const JwtGuard_1 = require("./Guards/JwtGuard");
|
|
7
|
+
const BasicGuard_1 = require("./Guards/BasicGuard");
|
|
8
|
+
const AuthContext_1 = require("./AuthContext");
|
|
9
|
+
const async_hooks_1 = require("async_hooks");
|
|
10
|
+
const EloquentUserProvider_1 = require("./Providers/EloquentUserProvider");
|
|
11
|
+
class AuthManager {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.providers = new Map();
|
|
14
|
+
this.eventDispatcher = null;
|
|
15
|
+
this.rateLimiter = null;
|
|
16
|
+
this.als = new async_hooks_1.AsyncLocalStorage();
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.defaultGuard = config.default || 'web';
|
|
19
|
+
}
|
|
20
|
+
setEventDispatcher(dispatcher) {
|
|
21
|
+
this.eventDispatcher = dispatcher;
|
|
22
|
+
}
|
|
23
|
+
setRateLimiter(limiter) {
|
|
24
|
+
this.rateLimiter = limiter;
|
|
25
|
+
}
|
|
26
|
+
registerProvider(name, provider) {
|
|
27
|
+
this.providers.set(name, provider);
|
|
28
|
+
}
|
|
29
|
+
extend(name, callback) {
|
|
30
|
+
// Implementation for custom guards
|
|
31
|
+
}
|
|
32
|
+
getDefaultGuard() {
|
|
33
|
+
return this.defaultGuard;
|
|
34
|
+
}
|
|
35
|
+
createContext(request) {
|
|
36
|
+
const context = new AuthContext_1.AuthContext(this, request);
|
|
37
|
+
// Optionally bind it directly to the request
|
|
38
|
+
if (request) {
|
|
39
|
+
request.auth = context;
|
|
40
|
+
}
|
|
41
|
+
return context;
|
|
42
|
+
}
|
|
43
|
+
resolveGuard(name, request) {
|
|
44
|
+
const config = this.config.guards[name];
|
|
45
|
+
if (!config) {
|
|
46
|
+
throw new Error(`Auth guard [${name}] is not defined.`);
|
|
47
|
+
}
|
|
48
|
+
if (config.driver === 'session') {
|
|
49
|
+
return this.createSessionDriver(name, config, request);
|
|
50
|
+
}
|
|
51
|
+
if (config.driver === 'token') {
|
|
52
|
+
return this.createTokenDriver(name, config, request);
|
|
53
|
+
}
|
|
54
|
+
if (config.driver === 'jwt') {
|
|
55
|
+
return this.createJwtDriver(name, config, request);
|
|
56
|
+
}
|
|
57
|
+
if (config.driver === 'basic') {
|
|
58
|
+
return this.createBasicDriver(name, config, request);
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Auth driver [${config.driver}] for guard [${name}] is not supported.`);
|
|
61
|
+
}
|
|
62
|
+
createSessionDriver(name, config, request) {
|
|
63
|
+
const provider = this.getProvider(config.provider);
|
|
64
|
+
return new SessionGuard_1.SessionGuard(provider, request.session);
|
|
65
|
+
}
|
|
66
|
+
createTokenDriver(name, config, request) {
|
|
67
|
+
const provider = this.getProvider(config.provider);
|
|
68
|
+
return new TokenGuard_1.TokenGuard(provider, request);
|
|
69
|
+
}
|
|
70
|
+
createJwtDriver(name, config, request) {
|
|
71
|
+
const provider = this.getProvider(config.provider);
|
|
72
|
+
return new JwtGuard_1.JwtGuard(provider, request, config.secret || 'default_secret', config.options || {});
|
|
73
|
+
}
|
|
74
|
+
createBasicDriver(name, config, request) {
|
|
75
|
+
const provider = this.getProvider(config.provider);
|
|
76
|
+
return new BasicGuard_1.BasicGuard(provider, request);
|
|
77
|
+
}
|
|
78
|
+
getProvider(name) {
|
|
79
|
+
// 1. Check if registered manually
|
|
80
|
+
if (this.providers.has(name)) {
|
|
81
|
+
return this.providers.get(name);
|
|
82
|
+
}
|
|
83
|
+
// 2. Resolve from config
|
|
84
|
+
const config = this.config.providers?.[name];
|
|
85
|
+
if (!config) {
|
|
86
|
+
throw new Error(`User provider [${name}] is not defined.`);
|
|
87
|
+
}
|
|
88
|
+
if (config.driver === 'eloquent') {
|
|
89
|
+
const provider = new EloquentUserProvider_1.EloquentUserProvider(config.model);
|
|
90
|
+
this.providers.set(name, provider);
|
|
91
|
+
return provider;
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`User provider driver [${config.driver}] is not supported.`);
|
|
94
|
+
}
|
|
95
|
+
shouldUse(name) {
|
|
96
|
+
this.defaultGuard = name;
|
|
97
|
+
}
|
|
98
|
+
runWithContext(context, fn) {
|
|
99
|
+
return this.als.run(context, fn);
|
|
100
|
+
}
|
|
101
|
+
getContext() {
|
|
102
|
+
const ctx = this.als.getStore();
|
|
103
|
+
if (!ctx) {
|
|
104
|
+
throw new Error('AuthContext not found. Ensure you are running within a request scope or use req.auth instead of the global facade.');
|
|
105
|
+
}
|
|
106
|
+
return ctx;
|
|
107
|
+
}
|
|
108
|
+
// Proxy methods to the context
|
|
109
|
+
guard(name) {
|
|
110
|
+
return this.getContext().guard(name);
|
|
111
|
+
}
|
|
112
|
+
resolve(token) {
|
|
113
|
+
return this.getContext().resolve(token);
|
|
114
|
+
}
|
|
115
|
+
async check() {
|
|
116
|
+
return await this.getContext().check();
|
|
117
|
+
}
|
|
118
|
+
async guest() {
|
|
119
|
+
return await this.getContext().guest();
|
|
120
|
+
}
|
|
121
|
+
async user() {
|
|
122
|
+
return await this.getContext().user();
|
|
123
|
+
}
|
|
124
|
+
async id() {
|
|
125
|
+
return await this.getContext().id();
|
|
126
|
+
}
|
|
127
|
+
async validate(credentials) {
|
|
128
|
+
return await this.getContext().validate(credentials);
|
|
129
|
+
}
|
|
130
|
+
setUser(user) {
|
|
131
|
+
this.getContext().setUser(user);
|
|
132
|
+
}
|
|
133
|
+
async attempt(credentials, remember = false) {
|
|
134
|
+
return await this.getContext().attempt(credentials, remember);
|
|
135
|
+
}
|
|
136
|
+
async login(user, remember = false) {
|
|
137
|
+
return await this.getContext().login(user, remember);
|
|
138
|
+
}
|
|
139
|
+
async logout() {
|
|
140
|
+
return await this.getContext().logout();
|
|
141
|
+
}
|
|
142
|
+
// Called by AuthContext to run attempts
|
|
143
|
+
async attemptForContext(context, credentials, remember = false) {
|
|
144
|
+
this.fireEvent('Auth.Attempting', { credentials, remember, guard: this.defaultGuard });
|
|
145
|
+
const throttleKey = this.getThrottleKey(credentials, context.getRequest());
|
|
146
|
+
if (throttleKey && this.rateLimiter) {
|
|
147
|
+
if (await this.rateLimiter.tooManyAttempts(throttleKey, 5)) {
|
|
148
|
+
this.fireEvent('Auth.Lockout', { credentials });
|
|
149
|
+
throw new Error('Too many login attempts. Please try again later.');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const guard = context.guard();
|
|
153
|
+
if (typeof guard.attempt === 'function') {
|
|
154
|
+
const successOrToken = await guard.attempt(credentials, remember);
|
|
155
|
+
if (successOrToken) {
|
|
156
|
+
if (throttleKey && this.rateLimiter) {
|
|
157
|
+
await this.rateLimiter.clear(throttleKey);
|
|
158
|
+
}
|
|
159
|
+
const user = await guard.user();
|
|
160
|
+
this.fireEvent('Auth.Login', { user, guard: this.defaultGuard });
|
|
161
|
+
return successOrToken; // Can return boolean true or JWT string
|
|
162
|
+
}
|
|
163
|
+
if (throttleKey && this.rateLimiter) {
|
|
164
|
+
await this.rateLimiter.hit(throttleKey, 1); // 1 minute decay
|
|
165
|
+
}
|
|
166
|
+
this.fireEvent('Auth.Failed', { credentials, guard: this.defaultGuard });
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
throw new Error(`Guard [${this.defaultGuard}] does not support login attempts.`);
|
|
170
|
+
}
|
|
171
|
+
// Called by AuthContext to log in
|
|
172
|
+
async loginForContext(context, user, remember = false) {
|
|
173
|
+
const guard = context.guard();
|
|
174
|
+
if (typeof guard.login === 'function') {
|
|
175
|
+
await guard.login(user, remember);
|
|
176
|
+
this.fireEvent('Auth.Login', { user, guard: this.defaultGuard });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
throw new Error(`Guard [${this.defaultGuard}] does not support login.`);
|
|
180
|
+
}
|
|
181
|
+
// Called by AuthContext to log out
|
|
182
|
+
async logoutForContext(context) {
|
|
183
|
+
const guard = context.guard();
|
|
184
|
+
const user = await guard.user();
|
|
185
|
+
if (typeof guard.logout === 'function') {
|
|
186
|
+
guard.logout();
|
|
187
|
+
this.fireEvent('Auth.Logout', { user, guard: this.defaultGuard });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
throw new Error(`Guard [${this.defaultGuard}] does not support logout.`);
|
|
191
|
+
}
|
|
192
|
+
// ── Email Verification ──────────────────────────────────────────
|
|
193
|
+
async sendVerification(context, user) {
|
|
194
|
+
const targetUser = user || await context.user();
|
|
195
|
+
if (!targetUser) {
|
|
196
|
+
throw new Error('No authenticated user to verify.');
|
|
197
|
+
}
|
|
198
|
+
if (typeof targetUser.hasVerifiedEmail === 'function' && targetUser.hasVerifiedEmail()) {
|
|
199
|
+
return; // Already verified
|
|
200
|
+
}
|
|
201
|
+
if (typeof targetUser.sendEmailVerificationNotification === 'function') {
|
|
202
|
+
await targetUser.sendEmailVerificationNotification();
|
|
203
|
+
this.fireEvent('Auth.VerificationSent', { user: targetUser });
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
throw new Error('User model does not implement sendEmailVerificationNotification().');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// ── Account Locking ─────────────────────────────────────────────
|
|
210
|
+
get lockoutThreshold() {
|
|
211
|
+
return this.config.lockout?.maxAttempts ?? 5;
|
|
212
|
+
}
|
|
213
|
+
get lockoutDuration() {
|
|
214
|
+
return this.config.lockout?.decayMinutes ?? 15;
|
|
215
|
+
}
|
|
216
|
+
async isLocked(context, credentials) {
|
|
217
|
+
if (!this.rateLimiter)
|
|
218
|
+
return false;
|
|
219
|
+
const throttleKey = this.getLockKey(credentials, context.getRequest());
|
|
220
|
+
if (!throttleKey)
|
|
221
|
+
return false;
|
|
222
|
+
return await this.rateLimiter.tooManyAttempts(throttleKey, this.lockoutThreshold);
|
|
223
|
+
}
|
|
224
|
+
async unlockAccount(context, credentials) {
|
|
225
|
+
if (!this.rateLimiter)
|
|
226
|
+
return;
|
|
227
|
+
const throttleKey = this.getLockKey(credentials, context.getRequest());
|
|
228
|
+
if (throttleKey) {
|
|
229
|
+
await this.rateLimiter.clear(throttleKey);
|
|
230
|
+
this.fireEvent('Auth.AccountUnlocked', { credentials });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
getLockKey(credentials, request) {
|
|
234
|
+
if (credentials.email) {
|
|
235
|
+
const ip = request?.ip || '127.0.0.1';
|
|
236
|
+
return `account_lock:${credentials.email}:${ip}`;
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
// ── Internals ───────────────────────────────────────────────────
|
|
241
|
+
fireEvent(name, payload) {
|
|
242
|
+
if (this.eventDispatcher) {
|
|
243
|
+
this.eventDispatcher.dispatch(name, payload);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
getThrottleKey(credentials, request) {
|
|
247
|
+
if (credentials.email) {
|
|
248
|
+
const ip = request?.ip || '127.0.0.1';
|
|
249
|
+
return `login_attempts:${credentials.email}:${ip}`;
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
exports.AuthManager = AuthManager;
|
|
255
|
+
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/AuthManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CanResetPassword {
|
|
2
|
+
/**
|
|
3
|
+
* Get the email address where password reset links are sent.
|
|
4
|
+
*/
|
|
5
|
+
getEmailForPasswordReset(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Send the password reset notification.
|
|
8
|
+
*/
|
|
9
|
+
sendPasswordResetNotification(token: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=CanResetPassword.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanResetPassword.d.ts","sourceRoot":"","sources":["../../../src/Contracts/CanResetPassword.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,wBAAwB,IAAI,MAAM,CAAC;IAEnC;;OAEG;IACH,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanResetPassword.js","sourceRoot":"","sources":["../../../src/Contracts/CanResetPassword.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CanVerifyEmail {
|
|
2
|
+
/**
|
|
3
|
+
* Determine if the user has verified their email address.
|
|
4
|
+
*/
|
|
5
|
+
hasVerifiedEmail(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Mark the given user's email as verified.
|
|
8
|
+
*/
|
|
9
|
+
markEmailAsVerified(): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Get the email address that should be used for verification.
|
|
12
|
+
*/
|
|
13
|
+
getEmailForVerification(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Send the email verification notification.
|
|
16
|
+
*/
|
|
17
|
+
sendEmailVerificationNotification(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=CanVerifyEmail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanVerifyEmail.d.ts","sourceRoot":"","sources":["../../../src/Contracts/CanVerifyEmail.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC;;OAEG;IACH,uBAAuB,IAAI,MAAM,CAAC;IAElC;;OAEG;IACH,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanVerifyEmail.js","sourceRoot":"","sources":["../../../src/Contracts/CanVerifyEmail.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDispatcher.d.ts","sourceRoot":"","sources":["../../../src/Contracts/EventDispatcher.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDispatcher.js","sourceRoot":"","sources":["../../../src/Contracts/EventDispatcher.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PasswordBroker {
|
|
2
|
+
/**
|
|
3
|
+
* Send a password reset link to a user.
|
|
4
|
+
*/
|
|
5
|
+
sendResetLink(credentials: Record<string, any>): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Reset the password for the given token.
|
|
8
|
+
*/
|
|
9
|
+
reset(credentials: Record<string, any>, callback: (user: any, password: string) => Promise<void>): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare const PasswordResetStatus: {
|
|
12
|
+
RESET_LINK_SENT: string;
|
|
13
|
+
RESET_THROTTLED: string;
|
|
14
|
+
INVALID_USER: string;
|
|
15
|
+
INVALID_TOKEN: string;
|
|
16
|
+
PASSWORD_RESET: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=PasswordBroker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordBroker.d.ts","sourceRoot":"","sources":["../../../src/Contracts/PasswordBroker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjE;;OAEG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtH;AAED,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PasswordResetStatus = void 0;
|
|
4
|
+
exports.PasswordResetStatus = {
|
|
5
|
+
RESET_LINK_SENT: 'passwords.sent',
|
|
6
|
+
RESET_THROTTLED: 'passwords.throttled',
|
|
7
|
+
INVALID_USER: 'passwords.user',
|
|
8
|
+
INVALID_TOKEN: 'passwords.token',
|
|
9
|
+
PASSWORD_RESET: 'passwords.reset',
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=PasswordBroker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordBroker.js","sourceRoot":"","sources":["../../../src/Contracts/PasswordBroker.ts"],"names":[],"mappings":";;;AAYa,QAAA,mBAAmB,GAAG;IAC/B,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,qBAAqB;IACtC,YAAY,EAAE,gBAAgB;IAC9B,aAAa,EAAE,iBAAiB;IAChC,cAAc,EAAE,iBAAiB;CACpC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RateLimiter {
|
|
2
|
+
/**
|
|
3
|
+
* Determine if the key has too many attempts
|
|
4
|
+
*/
|
|
5
|
+
tooManyAttempts(key: string, maxAttempts: number): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Hit the rate limiter for a given key
|
|
8
|
+
*/
|
|
9
|
+
hit(key: string, decayMinutes?: number): Promise<number>;
|
|
10
|
+
/**
|
|
11
|
+
* Clear the attempts for a given key
|
|
12
|
+
*/
|
|
13
|
+
clear(key: string): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=RateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/Contracts/RateLimiter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpE;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../src/Contracts/RateLimiter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface UserProvider {
|
|
2
|
+
retrieveById(id: string | number): Promise<any>;
|
|
3
|
+
retrieveByToken?(id: string | number, token: string): Promise<any>;
|
|
4
|
+
updateRememberToken?(user: any, token: string | null): Promise<void>;
|
|
5
|
+
updateRefreshToken?(user: any, token: string | null): Promise<void>;
|
|
6
|
+
retrieveByRefreshToken?(token: string): Promise<any>;
|
|
7
|
+
retrieveByCredentials(credentials: Record<string, any>): Promise<any>;
|
|
8
|
+
validateCredentials(user: any, credentials: Record<string, any>): boolean | Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=UserProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserProvider.d.ts","sourceRoot":"","sources":["../../../src/Contracts/UserProvider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,eAAe,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,mBAAmB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,sBAAsB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserProvider.js","sourceRoot":"","sources":["../../../src/Contracts/UserProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Guard {
|
|
2
|
+
check(): boolean | Promise<boolean>;
|
|
3
|
+
guest(): boolean | Promise<boolean>;
|
|
4
|
+
user(): any | Promise<any>;
|
|
5
|
+
id(): string | number | null | Promise<string | number | null>;
|
|
6
|
+
validate(credentials: Record<string, any>): boolean | Promise<boolean>;
|
|
7
|
+
setUser(user: any): void;
|
|
8
|
+
setRequest?(request: any): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=Guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Guard.d.ts","sourceRoot":"","sources":["../../src/Guard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IAClB,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,EAAE,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Guard.js","sourceRoot":"","sources":["../../src/Guard.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Guard } from '../Guard';
|
|
2
|
+
import { UserProvider } from '../Contracts/UserProvider';
|
|
3
|
+
export declare class BasicGuard implements Guard {
|
|
4
|
+
private provider;
|
|
5
|
+
private request;
|
|
6
|
+
private loggedUser;
|
|
7
|
+
constructor(provider: UserProvider, request: any);
|
|
8
|
+
check(): Promise<boolean>;
|
|
9
|
+
guest(): Promise<boolean>;
|
|
10
|
+
user(): Promise<any>;
|
|
11
|
+
id(): Promise<string | number | null>;
|
|
12
|
+
validate(credentials: Record<string, any>): Promise<boolean>;
|
|
13
|
+
setRequest(request: any): void;
|
|
14
|
+
setUser(user: any): void;
|
|
15
|
+
private getCredentialsFromRequest;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=BasicGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasicGuard.d.ts","sourceRoot":"","sources":["../../../src/Guards/BasicGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBAAa,UAAW,YAAW,KAAK;IACpC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,UAAU,CAAa;gBAEnB,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG;IAKnC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAepB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAKrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOlE,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAI9B,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAI/B,OAAO,CAAC,yBAAyB;CAYpC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BasicGuard = void 0;
|
|
4
|
+
class BasicGuard {
|
|
5
|
+
constructor(provider, request) {
|
|
6
|
+
this.loggedUser = null;
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
this.request = request;
|
|
9
|
+
}
|
|
10
|
+
async check() {
|
|
11
|
+
return !!(await this.user());
|
|
12
|
+
}
|
|
13
|
+
async guest() {
|
|
14
|
+
return !(await this.check());
|
|
15
|
+
}
|
|
16
|
+
async user() {
|
|
17
|
+
if (this.loggedUser)
|
|
18
|
+
return this.loggedUser;
|
|
19
|
+
const credentials = this.getCredentialsFromRequest();
|
|
20
|
+
if (!credentials)
|
|
21
|
+
return null;
|
|
22
|
+
const user = await this.provider.retrieveByCredentials(credentials);
|
|
23
|
+
if (user && await this.provider.validateCredentials(user, credentials)) {
|
|
24
|
+
this.loggedUser = user;
|
|
25
|
+
return user;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
async id() {
|
|
30
|
+
const user = await this.user();
|
|
31
|
+
return user ? user.id : null;
|
|
32
|
+
}
|
|
33
|
+
async validate(credentials) {
|
|
34
|
+
const user = await this.provider.retrieveByCredentials(credentials);
|
|
35
|
+
if (!user)
|
|
36
|
+
return false;
|
|
37
|
+
return await this.provider.validateCredentials(user, credentials);
|
|
38
|
+
}
|
|
39
|
+
setRequest(request) {
|
|
40
|
+
this.request = request;
|
|
41
|
+
}
|
|
42
|
+
setUser(user) {
|
|
43
|
+
this.loggedUser = user;
|
|
44
|
+
}
|
|
45
|
+
getCredentialsFromRequest() {
|
|
46
|
+
if (this.request?.headers?.['authorization']) {
|
|
47
|
+
const authHeader = this.request.headers['authorization'];
|
|
48
|
+
if (authHeader.startsWith('Basic ')) {
|
|
49
|
+
const b64 = authHeader.substring(6);
|
|
50
|
+
const decoded = Buffer.from(b64, 'base64').toString('ascii');
|
|
51
|
+
const [email, password] = decoded.split(':');
|
|
52
|
+
return { email, password };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.BasicGuard = BasicGuard;
|
|
59
|
+
//# sourceMappingURL=BasicGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasicGuard.js","sourceRoot":"","sources":["../../../src/Guards/BasicGuard.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IAKnB,YAAY,QAAsB,EAAE,OAAY;QAFxC,eAAU,GAAQ,IAAI,CAAC;QAG3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,IAAI;QACb,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrD,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,EAAE;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAgC;QAClD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAEM,UAAU,CAAC,OAAY;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,OAAO,CAAC,IAAS;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;IAEO,yBAAyB;QAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACzD,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAjED,gCAiEC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Guard } from '../Guard';
|
|
2
|
+
import { UserProvider } from '../Contracts/UserProvider';
|
|
3
|
+
export declare class JwtGuard implements Guard {
|
|
4
|
+
private provider;
|
|
5
|
+
private request;
|
|
6
|
+
private secret;
|
|
7
|
+
private options;
|
|
8
|
+
private loggedUser;
|
|
9
|
+
constructor(provider: UserProvider, request: any, secret: string, options?: any);
|
|
10
|
+
check(): Promise<boolean>;
|
|
11
|
+
guest(): Promise<boolean>;
|
|
12
|
+
user(): Promise<any>;
|
|
13
|
+
id(): Promise<string | number | null>;
|
|
14
|
+
validate(credentials: Record<string, any>): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Authenticate a user and return a JWT token and refresh token
|
|
17
|
+
*/
|
|
18
|
+
attempt(credentials: Record<string, any>): Promise<{
|
|
19
|
+
access_token: string;
|
|
20
|
+
refresh_token?: string;
|
|
21
|
+
} | false>;
|
|
22
|
+
issueTokens(user: any, additionalPayload?: object): Promise<{
|
|
23
|
+
access_token: string;
|
|
24
|
+
refresh_token?: string;
|
|
25
|
+
}>;
|
|
26
|
+
refresh(refreshToken: string): Promise<{
|
|
27
|
+
access_token: string;
|
|
28
|
+
refresh_token?: string;
|
|
29
|
+
}>;
|
|
30
|
+
login(user: any): void;
|
|
31
|
+
logout(): void;
|
|
32
|
+
setUser(user: any): void;
|
|
33
|
+
setRequest(request: any): void;
|
|
34
|
+
protected getTokenForRequest(): string | null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=JwtGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwtGuard.d.ts","sourceRoot":"","sources":["../../../src/Guards/JwtGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,qBAAa,QAAS,YAAW,KAAK;IAClC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,UAAU,CAAa;gBAEnB,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;IAOtE,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAsBpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAcrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOzE;;OAEG;IACU,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;IAS5G,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,iBAAiB,GAAE,MAAW,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAejH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAa9F,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAItB,MAAM,IAAI,IAAI;IAId,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAOxB,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAIrC,SAAS,CAAC,kBAAkB,IAAI,MAAM,GAAG,IAAI;CAkBhD"}
|