@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,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnsureEmailIsVerified = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Middleware that ensures the authenticated user has verified their email.
|
|
6
|
+
* Use as: .middleware(['verified'])
|
|
7
|
+
*/
|
|
8
|
+
class EnsureEmailIsVerified {
|
|
9
|
+
async handle(request, next, response) {
|
|
10
|
+
const user = request.auth ? await request.auth.user() : null;
|
|
11
|
+
if (!user) {
|
|
12
|
+
if (request.expectsJson && request.expectsJson()) {
|
|
13
|
+
return response.json({ message: 'Unauthenticated.' }, 401);
|
|
14
|
+
}
|
|
15
|
+
throw new Error('Unauthenticated.');
|
|
16
|
+
}
|
|
17
|
+
if (typeof user.hasVerifiedEmail === 'function' && !user.hasVerifiedEmail()) {
|
|
18
|
+
if (request.expectsJson && request.expectsJson()) {
|
|
19
|
+
return response.json({ message: 'Your email address is not verified.' }, 403);
|
|
20
|
+
}
|
|
21
|
+
throw new Error('Your email address is not verified.');
|
|
22
|
+
}
|
|
23
|
+
return next(request);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.EnsureEmailIsVerified = EnsureEmailIsVerified;
|
|
27
|
+
//# sourceMappingURL=EnsureEmailIsVerified.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnsureEmailIsVerified.js","sourceRoot":"","sources":["../../../src/Middleware/EnsureEmailIsVerified.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,qBAAqB;IACvB,KAAK,CAAC,MAAM,CAAC,OAAY,EAAE,IAAsC,EAAE,QAAc;QACpF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC1E,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACJ;AApBD,sDAoBC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { UserProvider } from '../Contracts/UserProvider';
|
|
2
|
+
export interface TokenRepository {
|
|
3
|
+
create(user: any): Promise<string>;
|
|
4
|
+
exists(user: any, token: string): Promise<boolean>;
|
|
5
|
+
delete(user: any): Promise<void>;
|
|
6
|
+
deleteExpired(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* In-memory token repository (production apps should use a database-backed one)
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryTokenRepository implements TokenRepository {
|
|
12
|
+
private tokens;
|
|
13
|
+
private expiryMinutes;
|
|
14
|
+
constructor(expiryMinutes?: number);
|
|
15
|
+
create(user: any): Promise<string>;
|
|
16
|
+
exists(user: any, token: string): Promise<boolean>;
|
|
17
|
+
delete(user: any): Promise<void>;
|
|
18
|
+
deleteExpired(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare class PasswordResetBroker {
|
|
21
|
+
private provider;
|
|
22
|
+
private tokens;
|
|
23
|
+
constructor(provider: UserProvider, tokens?: TokenRepository);
|
|
24
|
+
/**
|
|
25
|
+
* Send a password reset link to a user.
|
|
26
|
+
*/
|
|
27
|
+
sendResetLink(credentials: Record<string, any>): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Reset the password for the given token.
|
|
30
|
+
*/
|
|
31
|
+
reset(credentials: Record<string, any>, callback: (user: any, password: string) => Promise<void>): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Clean up expired tokens
|
|
34
|
+
*/
|
|
35
|
+
deleteExpiredTokens(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PasswordResetBroker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordResetBroker.d.ts","sourceRoot":"","sources":["../../../src/Passwords/PasswordResetBroker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC3D,OAAO,CAAC,MAAM,CAA8D;IAC5E,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAW;IAIzB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBlD,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAU9C;AAED,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,eAAe;IAK5D;;OAEG;IACU,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7E;;OAEG;IACU,KAAK,CACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACzD,OAAO,CAAC,MAAM,CAAC;IAgBlB;;OAEG;IACU,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PasswordResetBroker = exports.InMemoryTokenRepository = void 0;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
38
|
+
const PasswordBroker_1 = require("../Contracts/PasswordBroker");
|
|
39
|
+
/**
|
|
40
|
+
* In-memory token repository (production apps should use a database-backed one)
|
|
41
|
+
*/
|
|
42
|
+
class InMemoryTokenRepository {
|
|
43
|
+
constructor(expiryMinutes = 60) {
|
|
44
|
+
this.tokens = new Map();
|
|
45
|
+
this.expiryMinutes = expiryMinutes;
|
|
46
|
+
}
|
|
47
|
+
async create(user) {
|
|
48
|
+
const rawToken = crypto.randomBytes(32).toString('hex');
|
|
49
|
+
const hashedToken = crypto.createHash('sha256').update(rawToken).digest('hex');
|
|
50
|
+
this.tokens.set(String(user.id), {
|
|
51
|
+
token: hashedToken,
|
|
52
|
+
createdAt: new Date(),
|
|
53
|
+
});
|
|
54
|
+
return rawToken; // Return un-hashed version to be sent via email
|
|
55
|
+
}
|
|
56
|
+
async exists(user, token) {
|
|
57
|
+
const record = this.tokens.get(String(user.id));
|
|
58
|
+
if (!record)
|
|
59
|
+
return false;
|
|
60
|
+
const hashedToken = crypto.createHash('sha256').update(token).digest('hex');
|
|
61
|
+
// Check expiry
|
|
62
|
+
const now = new Date();
|
|
63
|
+
const diffMs = now.getTime() - record.createdAt.getTime();
|
|
64
|
+
const diffMins = diffMs / (1000 * 60);
|
|
65
|
+
if (diffMins > this.expiryMinutes) {
|
|
66
|
+
this.tokens.delete(String(user.id));
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return record.token === hashedToken;
|
|
70
|
+
}
|
|
71
|
+
async delete(user) {
|
|
72
|
+
this.tokens.delete(String(user.id));
|
|
73
|
+
}
|
|
74
|
+
async deleteExpired() {
|
|
75
|
+
const now = new Date();
|
|
76
|
+
for (const [key, record] of this.tokens.entries()) {
|
|
77
|
+
const diffMs = now.getTime() - record.createdAt.getTime();
|
|
78
|
+
const diffMins = diffMs / (1000 * 60);
|
|
79
|
+
if (diffMins > this.expiryMinutes) {
|
|
80
|
+
this.tokens.delete(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.InMemoryTokenRepository = InMemoryTokenRepository;
|
|
86
|
+
class PasswordResetBroker {
|
|
87
|
+
constructor(provider, tokens) {
|
|
88
|
+
this.provider = provider;
|
|
89
|
+
this.tokens = tokens || new InMemoryTokenRepository(60);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Send a password reset link to a user.
|
|
93
|
+
*/
|
|
94
|
+
async sendResetLink(credentials) {
|
|
95
|
+
const user = await this.provider.retrieveByCredentials(credentials);
|
|
96
|
+
if (!user) {
|
|
97
|
+
return PasswordBroker_1.PasswordResetStatus.INVALID_USER;
|
|
98
|
+
}
|
|
99
|
+
const token = await this.tokens.create(user);
|
|
100
|
+
if (typeof user.sendPasswordResetNotification === 'function') {
|
|
101
|
+
await user.sendPasswordResetNotification(token);
|
|
102
|
+
}
|
|
103
|
+
return PasswordBroker_1.PasswordResetStatus.RESET_LINK_SENT;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reset the password for the given token.
|
|
107
|
+
*/
|
|
108
|
+
async reset(credentials, callback) {
|
|
109
|
+
const user = await this.provider.retrieveByCredentials(credentials);
|
|
110
|
+
if (!user) {
|
|
111
|
+
return PasswordBroker_1.PasswordResetStatus.INVALID_USER;
|
|
112
|
+
}
|
|
113
|
+
if (!credentials.token || !(await this.tokens.exists(user, credentials.token))) {
|
|
114
|
+
return PasswordBroker_1.PasswordResetStatus.INVALID_TOKEN;
|
|
115
|
+
}
|
|
116
|
+
await callback(user, credentials.password);
|
|
117
|
+
await this.tokens.delete(user);
|
|
118
|
+
return PasswordBroker_1.PasswordResetStatus.PASSWORD_RESET;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Clean up expired tokens
|
|
122
|
+
*/
|
|
123
|
+
async deleteExpiredTokens() {
|
|
124
|
+
await this.tokens.deleteExpired();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.PasswordResetBroker = PasswordResetBroker;
|
|
128
|
+
//# sourceMappingURL=PasswordResetBroker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordResetBroker.js","sourceRoot":"","sources":["../../../src/Passwords/PasswordResetBroker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { UserProvider } from '../Contracts/UserProvider';
|
|
2
|
+
export declare class EloquentUserProvider implements UserProvider {
|
|
3
|
+
private model;
|
|
4
|
+
constructor(model: any);
|
|
5
|
+
/**
|
|
6
|
+
* Retrieve a user by their unique identifier.
|
|
7
|
+
*/
|
|
8
|
+
retrieveById(identifier: string | number): Promise<any | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Retrieve a user by their unique identifier and "remember me" token.
|
|
11
|
+
*/
|
|
12
|
+
retrieveByToken(identifier: string | number, token: string): Promise<any | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Update the "remember me" token for the given user in storage.
|
|
15
|
+
*/
|
|
16
|
+
updateRememberToken(user: any, token: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Retrieve a user by the given credentials.
|
|
19
|
+
*/
|
|
20
|
+
retrieveByCredentials(credentials: Record<string, any>): Promise<any | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate a user against the given credentials.
|
|
23
|
+
*/
|
|
24
|
+
validateCredentials(user: any, credentials: Record<string, any>): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Rehash the user's password if required.
|
|
27
|
+
*/
|
|
28
|
+
rehashPasswordIfRequired(user: any, credentials: Record<string, any>, force?: boolean): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=EloquentUserProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EloquentUserProvider.d.ts","sourceRoot":"","sources":["../../../src/Providers/EloquentUserProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,qBAAa,oBAAqB,YAAW,YAAY;IACzC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,GAAG;IAE9B;;OAEG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAI3E;;OAEG;IACU,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAK7F;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE;;OAEG;IACU,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAkBzF;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/F;;OAEG;IACU,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAM5H"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EloquentUserProvider = void 0;
|
|
4
|
+
const Hasher_1 = require("../Hasher");
|
|
5
|
+
class EloquentUserProvider {
|
|
6
|
+
constructor(model) {
|
|
7
|
+
this.model = model;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Retrieve a user by their unique identifier.
|
|
11
|
+
*/
|
|
12
|
+
async retrieveById(identifier) {
|
|
13
|
+
return await this.model.where('id', identifier).first();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Retrieve a user by their unique identifier and "remember me" token.
|
|
17
|
+
*/
|
|
18
|
+
async retrieveByToken(identifier, token) {
|
|
19
|
+
// Implement remember token logic if needed
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Update the "remember me" token for the given user in storage.
|
|
24
|
+
*/
|
|
25
|
+
async updateRememberToken(user, token) {
|
|
26
|
+
// Implement remember token logic if needed
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Retrieve a user by the given credentials.
|
|
30
|
+
*/
|
|
31
|
+
async retrieveByCredentials(credentials) {
|
|
32
|
+
if (Object.keys(credentials).length === 0 ||
|
|
33
|
+
(Object.keys(credentials).length === 1 && 'password' in credentials)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
let query = this.model;
|
|
37
|
+
for (const key in credentials) {
|
|
38
|
+
if (key === 'password') {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
query = query.where(key, credentials[key]);
|
|
42
|
+
}
|
|
43
|
+
return await query.first();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate a user against the given credentials.
|
|
47
|
+
*/
|
|
48
|
+
async validateCredentials(user, credentials) {
|
|
49
|
+
const plain = credentials.password;
|
|
50
|
+
return await Hasher_1.Hasher.check(plain, user.password);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Rehash the user's password if required.
|
|
54
|
+
*/
|
|
55
|
+
async rehashPasswordIfRequired(user, credentials, force = false) {
|
|
56
|
+
if (Hasher_1.Hasher.needsRehash(user.password) || force) {
|
|
57
|
+
user.password = await Hasher_1.Hasher.make(credentials.password);
|
|
58
|
+
await user.save();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.EloquentUserProvider = EloquentUserProvider;
|
|
63
|
+
//# sourceMappingURL=EloquentUserProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EloquentUserProvider.js","sourceRoot":"","sources":["../../../src/Providers/EloquentUserProvider.ts"],"names":[],"mappings":";;;AACA,sCAAmC;AAEnC,MAAa,oBAAoB;IAC7B,YAAoB,KAAU;QAAV,UAAK,GAAL,KAAK,CAAK;IAAI,CAAC;IAEnC;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,UAA2B;QACjD,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,UAA2B,EAAE,KAAa;QACnE,2CAA2C;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAAC,IAAS,EAAE,KAAa;QACrD,2CAA2C;IAC/C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB,CAAC,WAAgC;QAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC;YACrC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACrB,SAAS;YACb,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAAC,IAAS,EAAE,WAAgC;QACxE,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC;QACnC,OAAO,MAAM,eAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,wBAAwB,CAAC,IAAS,EAAE,WAAgC,EAAE,QAAiB,KAAK;QACrG,IAAI,eAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,QAAQ,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;IACL,CAAC;CACJ;AA/DD,oDA+DC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from './Guard';
|
|
2
|
+
export * from './AuthManager';
|
|
3
|
+
export * from './AuthContext';
|
|
4
|
+
export * from './Hasher';
|
|
5
|
+
export * from './Contracts/UserProvider';
|
|
6
|
+
export * from './Contracts/EventDispatcher';
|
|
7
|
+
export * from './Contracts/RateLimiter';
|
|
8
|
+
export * from './Contracts/CanVerifyEmail';
|
|
9
|
+
export * from './Contracts/CanResetPassword';
|
|
10
|
+
export * from './Contracts/PasswordBroker';
|
|
11
|
+
export * from './Guards/SessionGuard';
|
|
12
|
+
export * from './Guards/TokenGuard';
|
|
13
|
+
export * from './Guards/JwtGuard';
|
|
14
|
+
export * from './Guards/BasicGuard';
|
|
15
|
+
export * from './Passwords/PasswordResetBroker';
|
|
16
|
+
export * from './Middleware/Authenticate';
|
|
17
|
+
export * from './Middleware/EnsureEmailIsVerified';
|
|
18
|
+
export * from './Providers/EloquentUserProvider';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Guard"), exports);
|
|
18
|
+
__exportStar(require("./AuthManager"), exports);
|
|
19
|
+
__exportStar(require("./AuthContext"), exports);
|
|
20
|
+
__exportStar(require("./Hasher"), exports);
|
|
21
|
+
__exportStar(require("./Contracts/UserProvider"), exports);
|
|
22
|
+
__exportStar(require("./Contracts/EventDispatcher"), exports);
|
|
23
|
+
__exportStar(require("./Contracts/RateLimiter"), exports);
|
|
24
|
+
__exportStar(require("./Contracts/CanVerifyEmail"), exports);
|
|
25
|
+
__exportStar(require("./Contracts/CanResetPassword"), exports);
|
|
26
|
+
__exportStar(require("./Contracts/PasswordBroker"), exports);
|
|
27
|
+
__exportStar(require("./Guards/SessionGuard"), exports);
|
|
28
|
+
__exportStar(require("./Guards/TokenGuard"), exports);
|
|
29
|
+
__exportStar(require("./Guards/JwtGuard"), exports);
|
|
30
|
+
__exportStar(require("./Guards/BasicGuard"), exports);
|
|
31
|
+
__exportStar(require("./Passwords/PasswordResetBroker"), exports);
|
|
32
|
+
__exportStar(require("./Middleware/Authenticate"), exports);
|
|
33
|
+
__exportStar(require("./Middleware/EnsureEmailIsVerified"), exports);
|
|
34
|
+
__exportStar(require("./Providers/EloquentUserProvider"), exports);
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,gDAA8B;AAC9B,gDAA8B;AAC9B,2CAAyB;AACzB,2DAAyC;AACzC,8DAA4C;AAC5C,0DAAwC;AACxC,6DAA2C;AAC3C,+DAA6C;AAC7C,6DAA2C;AAC3C,wDAAsC;AACtC,sDAAoC;AACpC,oDAAkC;AAClC,sDAAoC;AACpC,kEAAgD;AAChD,4DAA0C;AAC1C,qEAAmD;AACnD,mEAAiD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Auth.test.d.ts","sourceRoot":"","sources":["../../tests/Auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const node_test_1 = require("node:test");
|
|
37
|
+
const assert = __importStar(require("node:assert"));
|
|
38
|
+
const src_1 = require("../src/index");
|
|
39
|
+
const SessionGuard_1 = require("../src/Guards/SessionGuard");
|
|
40
|
+
class MockPoolProvider {
|
|
41
|
+
constructor() {
|
|
42
|
+
this.users = [
|
|
43
|
+
{ id: 1, email: 'test@example.com', password: '$2a$10$...' }
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
async retrieveById(id) {
|
|
47
|
+
return this.users.find(u => u.id === Number(id)) || null;
|
|
48
|
+
}
|
|
49
|
+
async retrieveByCredentials(credentials) {
|
|
50
|
+
if (credentials.email === 'test@example.com') {
|
|
51
|
+
return this.users[0];
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
validateCredentials(user, credentials) {
|
|
56
|
+
return credentials.password === 'secret';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
(0, node_test_1.describe)('Arika Auth', () => {
|
|
60
|
+
let authManager;
|
|
61
|
+
let config;
|
|
62
|
+
(0, node_test_1.beforeEach)(() => {
|
|
63
|
+
config = {
|
|
64
|
+
default: 'web',
|
|
65
|
+
guards: {
|
|
66
|
+
web: { driver: 'session', provider: 'users' },
|
|
67
|
+
api: { driver: 'token', provider: 'users' }
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
authManager = new src_1.AuthManager(config);
|
|
71
|
+
authManager.registerProvider('users', new MockPoolProvider());
|
|
72
|
+
});
|
|
73
|
+
(0, node_test_1.it)('resolves session guard by default via context', async () => {
|
|
74
|
+
const request = { session: { get: () => null, put: () => { } } };
|
|
75
|
+
const ctx = authManager.createContext(request);
|
|
76
|
+
const guard = ctx.guard();
|
|
77
|
+
assert.ok(guard);
|
|
78
|
+
const isSessionGuard = guard instanceof SessionGuard_1.SessionGuard || guard.constructor.name === 'SessionGuard';
|
|
79
|
+
assert.ok(isSessionGuard);
|
|
80
|
+
});
|
|
81
|
+
(0, node_test_1.it)('proxies methods through context', async () => {
|
|
82
|
+
const session = {};
|
|
83
|
+
const request = {
|
|
84
|
+
session: {
|
|
85
|
+
get: (key) => session[key] || null,
|
|
86
|
+
put: (key, val) => { session[key] = val; },
|
|
87
|
+
forget: (key) => { delete session[key]; }
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const ctx = authManager.createContext(request);
|
|
91
|
+
const success = await ctx.attempt({ email: 'test@example.com', password: 'secret' });
|
|
92
|
+
assert.strictEqual(success, true);
|
|
93
|
+
const user = await ctx.user();
|
|
94
|
+
assert.ok(user);
|
|
95
|
+
assert.strictEqual(user.id, 1);
|
|
96
|
+
const check = await ctx.check();
|
|
97
|
+
assert.strictEqual(check, true);
|
|
98
|
+
await ctx.logout();
|
|
99
|
+
const checkAfterLogout = await ctx.check();
|
|
100
|
+
assert.strictEqual(checkAfterLogout, false);
|
|
101
|
+
});
|
|
102
|
+
(0, node_test_1.it)('can validate credentials via context guard', async () => {
|
|
103
|
+
const request = { session: { get: () => null, put: () => { } } };
|
|
104
|
+
const ctx = authManager.createContext(request);
|
|
105
|
+
const guard = ctx.guard('web');
|
|
106
|
+
const success = await guard.validate({ email: 'test@example.com', password: 'secret' });
|
|
107
|
+
assert.strictEqual(success, true);
|
|
108
|
+
const fail = await guard.validate({ email: 'test@example.com', password: 'wrong' });
|
|
109
|
+
assert.strictEqual(fail, false);
|
|
110
|
+
});
|
|
111
|
+
(0, node_test_1.it)('hashes passwords securely', async () => {
|
|
112
|
+
const password = 'my-secret-password';
|
|
113
|
+
const hash = await src_1.Hasher.make(password);
|
|
114
|
+
assert.ok(hash.length > 0);
|
|
115
|
+
assert.notStrictEqual(password, hash);
|
|
116
|
+
const valid = await src_1.Hasher.check(password, hash);
|
|
117
|
+
assert.strictEqual(valid, true);
|
|
118
|
+
const invalid = await src_1.Hasher.check('wrong', hash);
|
|
119
|
+
assert.strictEqual(invalid, false);
|
|
120
|
+
});
|
|
121
|
+
(0, node_test_1.it)('request-scoped auth context isolation', async () => {
|
|
122
|
+
// Simulate two concurrent requests
|
|
123
|
+
const session1 = {};
|
|
124
|
+
const request1 = {
|
|
125
|
+
session: {
|
|
126
|
+
get: (key) => session1[key] || null,
|
|
127
|
+
put: (key, val) => { session1[key] = val; },
|
|
128
|
+
forget: (key) => { delete session1[key]; }
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const session2 = {};
|
|
132
|
+
const request2 = {
|
|
133
|
+
session: {
|
|
134
|
+
get: (key) => session2[key] || null,
|
|
135
|
+
put: (key, val) => { session2[key] = val; },
|
|
136
|
+
forget: (key) => { delete session2[key]; }
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const ctx1 = authManager.createContext(request1);
|
|
140
|
+
const ctx2 = authManager.createContext(request2);
|
|
141
|
+
// Log in user on ctx1 only
|
|
142
|
+
await ctx1.attempt({ email: 'test@example.com', password: 'secret' });
|
|
143
|
+
const user1 = await ctx1.user();
|
|
144
|
+
assert.ok(user1);
|
|
145
|
+
// ctx2 should NOT have a user
|
|
146
|
+
const user2 = await ctx2.user();
|
|
147
|
+
assert.strictEqual(user2, null);
|
|
148
|
+
});
|
|
149
|
+
(0, node_test_1.it)('middleware protects routes with AuthContext', async () => {
|
|
150
|
+
const { Authenticate } = require('../src/Middleware/Authenticate');
|
|
151
|
+
const middleware = new Authenticate(authManager);
|
|
152
|
+
const next = async () => 'success';
|
|
153
|
+
// Mock request with token
|
|
154
|
+
const request = {
|
|
155
|
+
headers: { authorization: 'Bearer token-123' },
|
|
156
|
+
user: null,
|
|
157
|
+
session: { get: () => null, put: () => { } }
|
|
158
|
+
};
|
|
159
|
+
// Override config to default to 'api' for this test
|
|
160
|
+
authManager.shouldUse('api');
|
|
161
|
+
// Hack: mock the provider to accept this token
|
|
162
|
+
const provider = authManager['providers'].get('users');
|
|
163
|
+
provider.retrieveByCredentials = async (creds) => {
|
|
164
|
+
if (creds.api_token === 'token-123')
|
|
165
|
+
return { id: 1 };
|
|
166
|
+
return null;
|
|
167
|
+
};
|
|
168
|
+
// Should pass
|
|
169
|
+
const result = await middleware.handle(request, next);
|
|
170
|
+
assert.strictEqual(result, 'success');
|
|
171
|
+
// req.auth should have been set
|
|
172
|
+
assert.ok(request.auth);
|
|
173
|
+
const user = await request.auth.user();
|
|
174
|
+
assert.strictEqual(user.id, 1);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=Auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Auth.test.js","sourceRoot":"","sources":["../../tests/Auth.test.ts"],"names":[],"mappings":"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"}
|