@ambushsoftworks/nestjs-auth-graphql 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/README.md +190 -1
- package/dist/auth.module.d.ts +6 -0
- package/dist/auth.module.d.ts.map +1 -1
- package/dist/auth.module.js +30 -0
- package/dist/auth.module.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/decorators/allow-guest-session.decorator.d.ts +3 -0
- package/dist/decorators/allow-guest-session.decorator.d.ts.map +1 -0
- package/dist/decorators/allow-guest-session.decorator.js +8 -0
- package/dist/decorators/allow-guest-session.decorator.js.map +1 -0
- package/dist/decorators/current-guest.decorator.d.ts +2 -0
- package/dist/decorators/current-guest.decorator.d.ts.map +1 -0
- package/dist/decorators/current-guest.decorator.js +7 -0
- package/dist/decorators/current-guest.decorator.js.map +1 -0
- package/dist/exceptions/guest-session.exceptions.d.ts +9 -0
- package/dist/exceptions/guest-session.exceptions.d.ts.map +1 -0
- package/dist/exceptions/guest-session.exceptions.js +20 -0
- package/dist/exceptions/guest-session.exceptions.js.map +1 -0
- package/dist/guards/create-auth-guard.d.ts.map +1 -1
- package/dist/guards/create-auth-guard.js +29 -1
- package/dist/guards/create-auth-guard.js.map +1 -1
- package/dist/guards/guest-session.guard.d.ts +14 -0
- package/dist/guards/guest-session.guard.d.ts.map +1 -0
- package/dist/guards/guest-session.guard.js +63 -0
- package/dist/guards/guest-session.guard.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/auth-logger.interface.d.ts +6 -1
- package/dist/interfaces/auth-logger.interface.d.ts.map +1 -1
- package/dist/interfaces/auth-logger.interface.js +5 -0
- package/dist/interfaces/auth-logger.interface.js.map +1 -1
- package/dist/interfaces/guest-session-repository.interface.d.ts +37 -0
- package/dist/interfaces/guest-session-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/guest-session-repository.interface.js +3 -0
- package/dist/interfaces/guest-session-repository.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/index.js.map +1 -1
- package/dist/repositories/in-memory-guest-session.repository.d.ts +18 -0
- package/dist/repositories/in-memory-guest-session.repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-guest-session.repository.js +83 -0
- package/dist/repositories/in-memory-guest-session.repository.js.map +1 -0
- package/dist/services/guest-session.service.d.ts +80 -0
- package/dist/services/guest-session.service.d.ts.map +1 -0
- package/dist/services/guest-session.service.js +293 -0
- package/dist/services/guest-session.service.js.map +1 -0
- package/dist/testing/guest-session-repository.contract.d.ts +18 -0
- package/dist/testing/guest-session-repository.contract.d.ts.map +1 -0
- package/dist/testing/guest-session-repository.contract.js +368 -0
- package/dist/testing/guest-session-repository.contract.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4 -1
- package/dist/testing/index.js.map +1 -1
- package/examples/guest-sessions/prisma-guest-session.repository.ts +86 -0
- package/examples/guest-sessions/schema.prisma +33 -0
- package/package.json +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { AuthModuleOptions } from '../auth.module';
|
|
2
|
+
import { IAuthLogger } from '../interfaces/auth-logger.interface';
|
|
3
|
+
import { IGuestSessionRepository } from '../interfaces/guest-session-repository.interface';
|
|
4
|
+
export declare const GUEST_SESSION_COOKIE = "guest_session";
|
|
5
|
+
export declare const DEFAULT_GUEST_SESSION_OPTIONS: {
|
|
6
|
+
readonly maxGrantsPerSession: 10;
|
|
7
|
+
readonly maxLifetimeDays: 30;
|
|
8
|
+
};
|
|
9
|
+
export interface GuestGrant {
|
|
10
|
+
kind: string;
|
|
11
|
+
id: string;
|
|
12
|
+
expiresAt: Date;
|
|
13
|
+
}
|
|
14
|
+
export interface GuestPrincipal {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
principalId: string;
|
|
17
|
+
email: string;
|
|
18
|
+
realm?: string;
|
|
19
|
+
grants: GuestGrant[];
|
|
20
|
+
}
|
|
21
|
+
export interface IssuedGuestSession {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
token: string;
|
|
24
|
+
added: boolean;
|
|
25
|
+
grants: GuestGrant[];
|
|
26
|
+
}
|
|
27
|
+
type CookieResponse = {
|
|
28
|
+
cookie: (name: string, value: string, options: Record<string, unknown>) => void;
|
|
29
|
+
};
|
|
30
|
+
type ClearCookieResponse = {
|
|
31
|
+
clearCookie: (name: string, options: Record<string, unknown>) => void;
|
|
32
|
+
};
|
|
33
|
+
type RequestLike = Record<string, any>;
|
|
34
|
+
interface RealmOption {
|
|
35
|
+
realm?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export declare class GuestSessionService {
|
|
38
|
+
private readonly repository;
|
|
39
|
+
private readonly options;
|
|
40
|
+
private readonly securityLogger;
|
|
41
|
+
private readonly logger;
|
|
42
|
+
private readonly key;
|
|
43
|
+
private readonly realmsEnabled;
|
|
44
|
+
private readonly cookieAuthEnabled;
|
|
45
|
+
private lastSweepAt;
|
|
46
|
+
constructor(repository: IGuestSessionRepository | null, options: AuthModuleOptions, securityLogger: IAuthLogger);
|
|
47
|
+
get enabled(): boolean;
|
|
48
|
+
get cookieName(): string;
|
|
49
|
+
issue(input: {
|
|
50
|
+
principal: {
|
|
51
|
+
id: string;
|
|
52
|
+
email: string;
|
|
53
|
+
};
|
|
54
|
+
grant: {
|
|
55
|
+
kind: string;
|
|
56
|
+
id: string;
|
|
57
|
+
expiresAt: Date;
|
|
58
|
+
};
|
|
59
|
+
}, opts?: RealmOption & {
|
|
60
|
+
request?: RequestLike;
|
|
61
|
+
res?: CookieResponse;
|
|
62
|
+
ipAddress?: string;
|
|
63
|
+
}): Promise<IssuedGuestSession>;
|
|
64
|
+
authenticate(request: RequestLike | undefined, kinds: readonly string[]): Promise<GuestPrincipal | null>;
|
|
65
|
+
revokeGrant(grant: {
|
|
66
|
+
kind: string;
|
|
67
|
+
id: string;
|
|
68
|
+
}, opts?: RealmOption): Promise<number>;
|
|
69
|
+
revoke(sessionId: string): Promise<boolean>;
|
|
70
|
+
end(request: RequestLike | undefined, res?: ClearCookieResponse): Promise<void>;
|
|
71
|
+
private requireRepository;
|
|
72
|
+
private realmOf;
|
|
73
|
+
private readToken;
|
|
74
|
+
private find;
|
|
75
|
+
private hashToken;
|
|
76
|
+
private requireExpiry;
|
|
77
|
+
private sweep;
|
|
78
|
+
}
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=guest-session.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-session.service.d.ts","sourceRoot":"","sources":["../../src/services/guest-session.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var GuestSessionService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.GuestSessionService = exports.DEFAULT_GUEST_SESSION_OPTIONS = exports.GUEST_SESSION_COOKIE = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const crypto_1 = require("crypto");
|
|
19
|
+
const constants_1 = require("../constants");
|
|
20
|
+
const auth_logger_interface_1 = require("../interfaces/auth-logger.interface");
|
|
21
|
+
const guest_session_exceptions_1 = require("../exceptions/guest-session.exceptions");
|
|
22
|
+
const cookie_options_1 = require("../utils/cookie-options");
|
|
23
|
+
const cookies_1 = require("../utils/cookies");
|
|
24
|
+
const rate_limit_helpers_1 = require("../utils/rate-limit-helpers");
|
|
25
|
+
const request_realm_1 = require("../utils/request-realm");
|
|
26
|
+
exports.GUEST_SESSION_COOKIE = 'guest_session';
|
|
27
|
+
const AUTHORIZATION_SCHEME = /^Guest\s+(\S+)$/i;
|
|
28
|
+
const TOKEN_BYTES = 32;
|
|
29
|
+
const MAX_TOKEN_LENGTH = 128;
|
|
30
|
+
const MAX_ID_LENGTH = 200;
|
|
31
|
+
const KIND_PATTERN = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,63}$/;
|
|
32
|
+
const DAY_MS = 86_400_000;
|
|
33
|
+
const SWEEP_THROTTLE_MS = 2 * 60_000;
|
|
34
|
+
const HKDF_INFO = 'nestjs-auth-graphql guest-session/v1';
|
|
35
|
+
exports.DEFAULT_GUEST_SESSION_OPTIONS = {
|
|
36
|
+
maxGrantsPerSession: 10,
|
|
37
|
+
maxLifetimeDays: 30,
|
|
38
|
+
};
|
|
39
|
+
let GuestSessionService = GuestSessionService_1 = class GuestSessionService {
|
|
40
|
+
constructor(repository, options, securityLogger) {
|
|
41
|
+
this.repository = repository;
|
|
42
|
+
this.options = options;
|
|
43
|
+
this.securityLogger = securityLogger;
|
|
44
|
+
this.logger = new common_1.Logger(GuestSessionService_1.name);
|
|
45
|
+
this.lastSweepAt = 0;
|
|
46
|
+
this.key = Buffer.from((0, crypto_1.hkdfSync)('sha256', options.jwtSecret, Buffer.alloc(0), HKDF_INFO, 32));
|
|
47
|
+
this.realmsEnabled = Boolean(options.realmExtractorInstance);
|
|
48
|
+
this.cookieAuthEnabled = options.features?.cookieAuth === true;
|
|
49
|
+
}
|
|
50
|
+
get enabled() {
|
|
51
|
+
return this.repository !== null;
|
|
52
|
+
}
|
|
53
|
+
get cookieName() {
|
|
54
|
+
return (0, cookie_options_1.resolveHostPrefixedName)(exports.GUEST_SESSION_COOKIE, this.options.cookie);
|
|
55
|
+
}
|
|
56
|
+
async issue(input, opts = {}) {
|
|
57
|
+
const repository = this.requireRepository();
|
|
58
|
+
const realm = this.realmOf(opts);
|
|
59
|
+
const principalId = requireId(input.principal?.id, 'principal.id');
|
|
60
|
+
const email = (0, rate_limit_helpers_1.normaliseEmail)(input.principal?.email);
|
|
61
|
+
const kind = requireKind(input.grant?.kind);
|
|
62
|
+
const grantId = requireId(input.grant?.id, 'grant.id');
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const expiresAt = this.requireExpiry(input.grant?.expiresAt, now);
|
|
65
|
+
const token = (0, crypto_1.randomBytes)(TOKEN_BYTES).toString('base64url');
|
|
66
|
+
const tokenHash = this.hashToken(token);
|
|
67
|
+
const grant = {
|
|
68
|
+
id: (0, crypto_1.randomUUID)(),
|
|
69
|
+
sessionId: '',
|
|
70
|
+
kind,
|
|
71
|
+
grantId,
|
|
72
|
+
realm: realm ?? null,
|
|
73
|
+
expiresAt,
|
|
74
|
+
revokedAt: null,
|
|
75
|
+
createdAt: new Date(now),
|
|
76
|
+
};
|
|
77
|
+
const held = opts.request ? await this.find(repository, this.readToken(opts.request)) : null;
|
|
78
|
+
const joinable = held !== null &&
|
|
79
|
+
held.principalId === principalId &&
|
|
80
|
+
held.email === email &&
|
|
81
|
+
held.realm === (realm ?? null);
|
|
82
|
+
let sessionId;
|
|
83
|
+
let standing;
|
|
84
|
+
let added = false;
|
|
85
|
+
if (joinable && (await repository.rotateToken(held.id, held.tokenHash, tokenHash))) {
|
|
86
|
+
sessionId = held.id;
|
|
87
|
+
added = true;
|
|
88
|
+
standing = held.grants.filter((g) => isStanding(g, now));
|
|
89
|
+
for (const earlier of standing.filter((g) => g.kind === kind && g.grantId === grantId)) {
|
|
90
|
+
await repository.revokeGrant(earlier.id);
|
|
91
|
+
standing = standing.filter((g) => g.id !== earlier.id);
|
|
92
|
+
}
|
|
93
|
+
const max = this.options.guestSession?.maxGrantsPerSession ?? exports.DEFAULT_GUEST_SESSION_OPTIONS.maxGrantsPerSession;
|
|
94
|
+
while (standing.length >= max) {
|
|
95
|
+
const soonest = standing.reduce((a, b) => (b.expiresAt.getTime() < a.expiresAt.getTime() ? b : a));
|
|
96
|
+
await repository.revokeGrant(soonest.id);
|
|
97
|
+
standing = standing.filter((g) => g.id !== soonest.id);
|
|
98
|
+
}
|
|
99
|
+
grant.sessionId = sessionId;
|
|
100
|
+
await repository.addGrant(grant);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
sessionId = (0, crypto_1.randomUUID)();
|
|
104
|
+
standing = [];
|
|
105
|
+
grant.sessionId = sessionId;
|
|
106
|
+
await repository.createSession({
|
|
107
|
+
id: sessionId,
|
|
108
|
+
tokenHash,
|
|
109
|
+
principalId,
|
|
110
|
+
email,
|
|
111
|
+
realm: realm ?? null,
|
|
112
|
+
revokedAt: null,
|
|
113
|
+
createdAt: new Date(now),
|
|
114
|
+
}, grant);
|
|
115
|
+
}
|
|
116
|
+
standing = [...standing, grant];
|
|
117
|
+
if (opts.res && this.cookieAuthEnabled) {
|
|
118
|
+
const lastEnd = Math.max(...standing.map((g) => g.expiresAt.getTime()));
|
|
119
|
+
opts.res.cookie(this.cookieName, token, {
|
|
120
|
+
...(0, cookie_options_1.buildAccessTokenCookieOptions)(this.options.cookie),
|
|
121
|
+
maxAge: Math.max(0, lastEnd - now),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.GUEST_SESSION_ISSUED, {
|
|
125
|
+
sessionId,
|
|
126
|
+
principalId,
|
|
127
|
+
email,
|
|
128
|
+
kind,
|
|
129
|
+
grantId,
|
|
130
|
+
realm,
|
|
131
|
+
ipAddress: opts.ipAddress,
|
|
132
|
+
added,
|
|
133
|
+
expiresAt,
|
|
134
|
+
});
|
|
135
|
+
void this.sweep(repository);
|
|
136
|
+
return { sessionId, token, added, grants: standing.map(toGrant) };
|
|
137
|
+
}
|
|
138
|
+
async authenticate(request, kinds) {
|
|
139
|
+
const token = this.readToken(request);
|
|
140
|
+
if (token === null || !this.repository) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const session = await this.find(this.repository, token);
|
|
144
|
+
if (!session)
|
|
145
|
+
throw new guest_session_exceptions_1.GuestSessionInvalidException();
|
|
146
|
+
const reject = (reason) => {
|
|
147
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.GUEST_SESSION_REJECTED, {
|
|
148
|
+
sessionId: session.id,
|
|
149
|
+
principalId: session.principalId,
|
|
150
|
+
email: session.email,
|
|
151
|
+
realm: session.realm ?? undefined,
|
|
152
|
+
kinds: [...kinds],
|
|
153
|
+
reason,
|
|
154
|
+
});
|
|
155
|
+
throw new guest_session_exceptions_1.GuestSessionInvalidException();
|
|
156
|
+
};
|
|
157
|
+
if (session.revokedAt !== null)
|
|
158
|
+
return reject('revoked');
|
|
159
|
+
if (((0, request_realm_1.realmForRequest)(request, this.realmsEnabled) ?? null) !== session.realm)
|
|
160
|
+
return reject('realm_mismatch');
|
|
161
|
+
const ofKind = session.grants.filter((g) => kinds.includes(g.kind));
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
const standing = ofKind.filter((g) => isStanding(g, now));
|
|
164
|
+
if (standing.length === 0) {
|
|
165
|
+
if (ofKind.length === 0)
|
|
166
|
+
return reject('kind_not_allowed');
|
|
167
|
+
return reject(ofKind.some((g) => g.revokedAt === null) ? 'expired' : 'revoked');
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
sessionId: session.id,
|
|
171
|
+
principalId: session.principalId,
|
|
172
|
+
email: session.email,
|
|
173
|
+
...(session.realm !== null ? { realm: session.realm } : {}),
|
|
174
|
+
grants: standing.map(toGrant),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
async revokeGrant(grant, opts = {}) {
|
|
178
|
+
const repository = this.requireRepository();
|
|
179
|
+
const realm = this.realmOf(opts);
|
|
180
|
+
const kind = requireKind(grant?.kind);
|
|
181
|
+
const grantId = requireId(grant?.id, 'grant.id');
|
|
182
|
+
const count = await repository.revokeGrants({ kind, grantId, realm: realm ?? null });
|
|
183
|
+
if (count > 0) {
|
|
184
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.GUEST_GRANT_REVOKED, { kind, grantId, realm, count });
|
|
185
|
+
}
|
|
186
|
+
return count;
|
|
187
|
+
}
|
|
188
|
+
async revoke(sessionId) {
|
|
189
|
+
const repository = this.requireRepository();
|
|
190
|
+
const revoked = await repository.revokeSession(requireId(sessionId, 'sessionId'));
|
|
191
|
+
if (revoked) {
|
|
192
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.GUEST_SESSION_REVOKED, { sessionId });
|
|
193
|
+
}
|
|
194
|
+
return revoked;
|
|
195
|
+
}
|
|
196
|
+
async end(request, res) {
|
|
197
|
+
const repository = this.requireRepository();
|
|
198
|
+
const session = await this.find(repository, this.readToken(request));
|
|
199
|
+
if (session && (await repository.revokeSession(session.id))) {
|
|
200
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.GUEST_SESSION_ENDED, {
|
|
201
|
+
sessionId: session.id,
|
|
202
|
+
principalId: session.principalId,
|
|
203
|
+
email: session.email,
|
|
204
|
+
realm: session.realm ?? undefined,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
if (res && this.cookieAuthEnabled) {
|
|
208
|
+
const { maxAge: _maxAge, ...attributes } = (0, cookie_options_1.buildAccessTokenCookieOptions)(this.options.cookie);
|
|
209
|
+
res.clearCookie(this.cookieName, attributes);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
requireRepository() {
|
|
213
|
+
if (!this.repository)
|
|
214
|
+
throw new guest_session_exceptions_1.GuestSessionUnavailableException();
|
|
215
|
+
return this.repository;
|
|
216
|
+
}
|
|
217
|
+
realmOf(opts) {
|
|
218
|
+
const realm = opts.realm ?? undefined;
|
|
219
|
+
if (this.realmsEnabled && realm === undefined) {
|
|
220
|
+
throw new common_1.BadRequestException('Realm required');
|
|
221
|
+
}
|
|
222
|
+
return realm;
|
|
223
|
+
}
|
|
224
|
+
readToken(request) {
|
|
225
|
+
const header = request?.headers?.authorization ?? request?.headers?.Authorization;
|
|
226
|
+
const fromHeader = typeof header === 'string' ? AUTHORIZATION_SCHEME.exec(header)?.[1] : undefined;
|
|
227
|
+
if (fromHeader)
|
|
228
|
+
return fromHeader;
|
|
229
|
+
return this.cookieAuthEnabled ? (0, cookies_1.readCookie)(request, this.cookieName) : null;
|
|
230
|
+
}
|
|
231
|
+
async find(repository, token) {
|
|
232
|
+
if (token === null || token.length > MAX_TOKEN_LENGTH) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
return repository.findSessionByTokenHash(this.hashToken(token));
|
|
236
|
+
}
|
|
237
|
+
hashToken(token) {
|
|
238
|
+
return (0, crypto_1.createHmac)('sha256', this.key).update(token).digest('hex');
|
|
239
|
+
}
|
|
240
|
+
requireExpiry(expiresAt, now) {
|
|
241
|
+
if (!(expiresAt instanceof Date) || Number.isNaN(expiresAt.getTime())) {
|
|
242
|
+
throw new common_1.BadRequestException('grant.expiresAt must be a Date');
|
|
243
|
+
}
|
|
244
|
+
if (expiresAt.getTime() <= now) {
|
|
245
|
+
throw new common_1.BadRequestException('grant.expiresAt must be in the future');
|
|
246
|
+
}
|
|
247
|
+
const maxDays = this.options.guestSession?.maxLifetimeDays ?? exports.DEFAULT_GUEST_SESSION_OPTIONS.maxLifetimeDays;
|
|
248
|
+
if (expiresAt.getTime() > now + maxDays * DAY_MS) {
|
|
249
|
+
throw new common_1.BadRequestException(`grant.expiresAt is more than ${maxDays} days away, the most guestSession.maxLifetimeDays allows`);
|
|
250
|
+
}
|
|
251
|
+
return new Date(expiresAt.getTime());
|
|
252
|
+
}
|
|
253
|
+
async sweep(repository) {
|
|
254
|
+
const now = Date.now();
|
|
255
|
+
if (now - this.lastSweepAt < SWEEP_THROTTLE_MS) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
this.lastSweepAt = now;
|
|
259
|
+
try {
|
|
260
|
+
await repository.deleteExpired();
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
this.logger.warn(`Sweeping expired guest sessions failed: ${error instanceof Error ? error.message : String(error)}. Grants still expire: every request checks the date.`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
exports.GuestSessionService = GuestSessionService;
|
|
268
|
+
exports.GuestSessionService = GuestSessionService = GuestSessionService_1 = __decorate([
|
|
269
|
+
(0, common_1.Injectable)(),
|
|
270
|
+
__param(0, (0, common_1.Inject)(constants_1.GUEST_SESSION_REPOSITORY)),
|
|
271
|
+
__param(1, (0, common_1.Inject)(constants_1.AUTH_MODULE_OPTIONS)),
|
|
272
|
+
__param(2, (0, common_1.Inject)(constants_1.AUTH_LOGGER)),
|
|
273
|
+
__metadata("design:paramtypes", [Object, Object, Object])
|
|
274
|
+
], GuestSessionService);
|
|
275
|
+
function isStanding(grant, now) {
|
|
276
|
+
return grant.revokedAt === null && grant.expiresAt.getTime() > now;
|
|
277
|
+
}
|
|
278
|
+
function toGrant(grant) {
|
|
279
|
+
return { kind: grant.kind, id: grant.grantId, expiresAt: grant.expiresAt };
|
|
280
|
+
}
|
|
281
|
+
function requireId(value, name) {
|
|
282
|
+
if (typeof value !== 'string' || value.length === 0 || value.length > MAX_ID_LENGTH) {
|
|
283
|
+
throw new common_1.BadRequestException(`${name} must be a non-empty string of at most ${MAX_ID_LENGTH} characters`);
|
|
284
|
+
}
|
|
285
|
+
return value;
|
|
286
|
+
}
|
|
287
|
+
function requireKind(kind) {
|
|
288
|
+
if (typeof kind !== 'string' || !KIND_PATTERN.test(kind)) {
|
|
289
|
+
throw new common_1.BadRequestException('grant.kind must be 1 to 64 letters, digits, ":", ".", "_" or "-", starting with a letter or digit');
|
|
290
|
+
}
|
|
291
|
+
return kind;
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=guest-session.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-session.service.js","sourceRoot":"","sources":["../../src/services/guest-session.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IGuestSessionRepository } from '../interfaces/guest-session-repository.interface';
|
|
2
|
+
export declare class GuestSessionRepositoryContractError extends Error {
|
|
3
|
+
constructor(check: string, detail: string, options?: {
|
|
4
|
+
cause?: unknown;
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export interface GuestSessionContractCreatedIds {
|
|
8
|
+
sessionIds: string[];
|
|
9
|
+
grantIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface GuestSessionRepositoryContractOptions {
|
|
12
|
+
realms?: boolean;
|
|
13
|
+
cleanup?: (created: GuestSessionContractCreatedIds) => void | Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
type Factory = () => IGuestSessionRepository | Promise<IGuestSessionRepository>;
|
|
16
|
+
export declare function assertGuestSessionRepositoryContract(factory: Factory, options?: GuestSessionRepositoryContractOptions): Promise<void>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=guest-session-repository.contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-session-repository.contract.d.ts","sourceRoot":"","sources":["../../src/testing/guest-session-repository.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,uBAAuB,EACxB,MAAM,kDAAkD,CAAC;AAG1D,qBAAa,mCAAoC,SAAQ,KAAK;gBAChD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAOzE;AAGD,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qCAAqC;IAQpD,MAAM,CAAC,EAAE,OAAO,CAAC;IAYjB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,KAAK,OAAO,GAAG,MAAM,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAgDhF,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|