@nauth-toolkit/core 0.1.0 → 0.1.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/LICENSE +90 -0
- package/README.md +9 -0
- package/package.json +8 -3
- package/jest.config.js +0 -15
- package/jest.setup.ts +0 -6
- package/src/adapters/database-columns.ts +0 -165
- package/src/adapters/express.adapter.ts +0 -385
- package/src/adapters/fastify.adapter.ts +0 -416
- package/src/adapters/index.ts +0 -16
- package/src/adapters/storage.factory.ts +0 -143
- package/src/bootstrap.ts +0 -374
- package/src/dto/auth-challenge.dto.ts +0 -231
- package/src/dto/auth-response.dto.ts +0 -253
- package/src/dto/challenge-response.dto.ts +0 -234
- package/src/dto/change-password-request.dto.ts +0 -50
- package/src/dto/change-password-response.dto.ts +0 -29
- package/src/dto/change-password.dto.ts +0 -57
- package/src/dto/error-response.dto.ts +0 -136
- package/src/dto/get-available-methods.dto.ts +0 -55
- package/src/dto/get-challenge-data-response.dto.ts +0 -28
- package/src/dto/get-challenge-data.dto.ts +0 -69
- package/src/dto/get-client-info.dto.ts +0 -104
- package/src/dto/get-device-token-response.dto.ts +0 -25
- package/src/dto/get-events-by-type.dto.ts +0 -76
- package/src/dto/get-ip-address-response.dto.ts +0 -24
- package/src/dto/get-mfa-status.dto.ts +0 -94
- package/src/dto/get-risk-assessment-history.dto.ts +0 -39
- package/src/dto/get-session-id-response.dto.ts +0 -25
- package/src/dto/get-setup-data-response.dto.ts +0 -31
- package/src/dto/get-setup-data.dto.ts +0 -75
- package/src/dto/get-suspicious-activity.dto.ts +0 -42
- package/src/dto/get-user-agent-response.dto.ts +0 -23
- package/src/dto/get-user-auth-history.dto.ts +0 -95
- package/src/dto/get-user-by-email.dto.ts +0 -61
- package/src/dto/get-user-by-id.dto.ts +0 -46
- package/src/dto/get-user-devices.dto.ts +0 -53
- package/src/dto/get-user-response.dto.ts +0 -17
- package/src/dto/has-provider.dto.ts +0 -56
- package/src/dto/index.ts +0 -57
- package/src/dto/is-trusted-device-response.dto.ts +0 -34
- package/src/dto/list-providers-response.dto.ts +0 -23
- package/src/dto/login.dto.ts +0 -95
- package/src/dto/logout-all-response.dto.ts +0 -24
- package/src/dto/logout-all.dto.ts +0 -65
- package/src/dto/logout-response.dto.ts +0 -25
- package/src/dto/logout.dto.ts +0 -64
- package/src/dto/refresh-token.dto.ts +0 -36
- package/src/dto/remove-devices.dto.ts +0 -85
- package/src/dto/resend-code-response.dto.ts +0 -32
- package/src/dto/resend-code.dto.ts +0 -51
- package/src/dto/reset-password.dto.ts +0 -115
- package/src/dto/respond-challenge.dto.ts +0 -272
- package/src/dto/set-mfa-exemption.dto.ts +0 -112
- package/src/dto/set-must-change-password-response.dto.ts +0 -27
- package/src/dto/set-must-change-password.dto.ts +0 -46
- package/src/dto/set-preferred-method.dto.ts +0 -80
- package/src/dto/setup-mfa.dto.ts +0 -98
- package/src/dto/signup.dto.ts +0 -174
- package/src/dto/social-auth.dto.ts +0 -422
- package/src/dto/trust-device-response.dto.ts +0 -30
- package/src/dto/trust-device.dto.ts +0 -9
- package/src/dto/update-user-attributes-request.dto.ts +0 -51
- package/src/dto/user-response.dto.ts +0 -138
- package/src/dto/user-update.dto.ts +0 -222
- package/src/dto/verify-email.dto.ts +0 -313
- package/src/dto/verify-mfa-code.dto.ts +0 -103
- package/src/dto/verify-phone-by-sub.dto.ts +0 -78
- package/src/dto/verify-phone.dto.ts +0 -245
- package/src/entities/auth-audit.entity.ts +0 -232
- package/src/entities/challenge-session.entity.ts +0 -116
- package/src/entities/index.ts +0 -29
- package/src/entities/login-attempt.entity.ts +0 -64
- package/src/entities/mfa-device.entity.ts +0 -151
- package/src/entities/rate-limit.entity.ts +0 -44
- package/src/entities/session.entity.ts +0 -180
- package/src/entities/social-account.entity.ts +0 -96
- package/src/entities/storage-lock.entity.ts +0 -39
- package/src/entities/trusted-device.entity.ts +0 -112
- package/src/entities/user.entity.ts +0 -243
- package/src/entities/verification-token.entity.ts +0 -141
- package/src/enums/auth-audit-event-type.enum.ts +0 -360
- package/src/enums/error-codes.enum.ts +0 -420
- package/src/enums/mfa-method.enum.ts +0 -97
- package/src/enums/risk-factor.enum.ts +0 -111
- package/src/exceptions/nauth.exception.ts +0 -231
- package/src/handlers/auth.handler.ts +0 -260
- package/src/handlers/client-info.handler.ts +0 -101
- package/src/handlers/csrf.handler.ts +0 -156
- package/src/handlers/token-delivery.handler.ts +0 -118
- package/src/index.ts +0 -118
- package/src/interfaces/client-info.interface.ts +0 -85
- package/src/interfaces/config.interface.ts +0 -2135
- package/src/interfaces/entities.interface.ts +0 -226
- package/src/interfaces/index.ts +0 -15
- package/src/interfaces/logger.interface.ts +0 -283
- package/src/interfaces/mfa-provider.interface.ts +0 -154
- package/src/interfaces/oauth.interface.ts +0 -148
- package/src/interfaces/provider.interface.ts +0 -47
- package/src/interfaces/social-auth-provider.interface.ts +0 -131
- package/src/interfaces/storage-adapter.interface.ts +0 -82
- package/src/interfaces/template.interface.ts +0 -510
- package/src/interfaces/token-verifier.interface.ts +0 -110
- package/src/internal.ts +0 -178
- package/src/platform/interfaces.ts +0 -299
- package/src/schemas/auth-config.schema.ts +0 -646
- package/src/services/adaptive-mfa-decision.service.spec.ts +0 -1058
- package/src/services/adaptive-mfa-decision.service.ts +0 -457
- package/src/services/auth-audit.service.spec.ts +0 -675
- package/src/services/auth-audit.service.ts +0 -558
- package/src/services/auth-challenge-helper.service.spec.ts +0 -3227
- package/src/services/auth-challenge-helper.service.ts +0 -825
- package/src/services/auth-flow-context-builder.service.ts +0 -520
- package/src/services/auth-flow-rules.ts +0 -202
- package/src/services/auth-flow-state-definitions.ts +0 -190
- package/src/services/auth-flow-state-machine.service.ts +0 -207
- package/src/services/auth-flow-state-machine.types.ts +0 -316
- package/src/services/auth.service.spec.ts +0 -4195
- package/src/services/auth.service.ts +0 -3727
- package/src/services/challenge.service.spec.ts +0 -1363
- package/src/services/challenge.service.ts +0 -696
- package/src/services/client-info.service.spec.ts +0 -572
- package/src/services/client-info.service.ts +0 -374
- package/src/services/csrf.service.ts +0 -54
- package/src/services/email-verification.service.spec.ts +0 -1229
- package/src/services/email-verification.service.ts +0 -578
- package/src/services/geo-location.service.spec.ts +0 -603
- package/src/services/geo-location.service.ts +0 -599
- package/src/services/index.ts +0 -13
- package/src/services/jwt.service.spec.ts +0 -882
- package/src/services/jwt.service.ts +0 -621
- package/src/services/mfa-base.service.spec.ts +0 -246
- package/src/services/mfa-base.service.ts +0 -611
- package/src/services/mfa.service.spec.ts +0 -693
- package/src/services/mfa.service.ts +0 -960
- package/src/services/password.service.spec.ts +0 -166
- package/src/services/password.service.ts +0 -309
- package/src/services/phone-verification.service.spec.ts +0 -1120
- package/src/services/phone-verification.service.ts +0 -751
- package/src/services/risk-detection.service.spec.ts +0 -1292
- package/src/services/risk-detection.service.ts +0 -1012
- package/src/services/risk-scoring.service.spec.ts +0 -204
- package/src/services/risk-scoring.service.ts +0 -131
- package/src/services/session.service.spec.ts +0 -1293
- package/src/services/session.service.ts +0 -803
- package/src/services/social-account.service.spec.ts +0 -725
- package/src/services/social-auth-base.service.spec.ts +0 -418
- package/src/services/social-auth-base.service.ts +0 -581
- package/src/services/social-auth.service.spec.ts +0 -238
- package/src/services/social-auth.service.ts +0 -436
- package/src/services/social-provider-registry.service.spec.ts +0 -238
- package/src/services/social-provider-registry.service.ts +0 -122
- package/src/services/trusted-device.service.spec.ts +0 -505
- package/src/services/trusted-device.service.ts +0 -339
- package/src/storage/account-lockout-storage.service.spec.ts +0 -310
- package/src/storage/account-lockout-storage.service.ts +0 -89
- package/src/storage/index.ts +0 -3
- package/src/storage/memory-storage.adapter.ts +0 -443
- package/src/storage/rate-limit-storage.service.spec.ts +0 -247
- package/src/storage/rate-limit-storage.service.ts +0 -38
- package/src/templates/html-template.engine.spec.ts +0 -161
- package/src/templates/html-template.engine.ts +0 -688
- package/src/templates/index.ts +0 -7
- package/src/utils/common-passwords.spec.ts +0 -230
- package/src/utils/common-passwords.ts +0 -170
- package/src/utils/context-storage.ts +0 -188
- package/src/utils/cookie-names.util.ts +0 -67
- package/src/utils/cookies.util.ts +0 -94
- package/src/utils/index.ts +0 -12
- package/src/utils/ip-extractor.spec.ts +0 -330
- package/src/utils/ip-extractor.ts +0 -220
- package/src/utils/nauth-logger.spec.ts +0 -388
- package/src/utils/nauth-logger.ts +0 -215
- package/src/utils/pii-redactor.spec.ts +0 -130
- package/src/utils/pii-redactor.ts +0 -288
- package/src/utils/setup/get-repositories.ts +0 -140
- package/src/utils/setup/init-services.ts +0 -422
- package/src/utils/setup/init-social.ts +0 -189
- package/src/utils/setup/init-storage.ts +0 -94
- package/src/utils/setup/register-mfa.ts +0 -165
- package/src/utils/setup/run-nauth-migrations.ts +0 -61
- package/src/utils/token-delivery-policy.ts +0 -38
- package/src/validators/template.validator.ts +0 -219
- package/tsconfig.json +0 -37
- package/tsconfig.lint.json +0 -6
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { SocialProviderRegistry } from './social-provider-registry.service';
|
|
2
|
-
import { ISocialAuthProviderService } from '../interfaces/social-auth-provider.interface';
|
|
3
|
-
import { NAuthException } from '../exceptions/nauth.exception';
|
|
4
|
-
import { AuthErrorCode } from '../enums/error-codes.enum';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Social Provider Registry Unit Tests
|
|
8
|
-
*
|
|
9
|
-
* Tests social authentication provider registry functionality.
|
|
10
|
-
* Covers provider registration, lookup, and listing.
|
|
11
|
-
*
|
|
12
|
-
* Platform-agnostic: Uses direct instantiation, no NestJS dependencies.
|
|
13
|
-
*/
|
|
14
|
-
describe('SocialProviderRegistry', () => {
|
|
15
|
-
let service: SocialProviderRegistry;
|
|
16
|
-
let mockProvider1: jest.Mocked<ISocialAuthProviderService>;
|
|
17
|
-
let mockProvider2: jest.Mocked<ISocialAuthProviderService>;
|
|
18
|
-
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
// Create mock providers
|
|
21
|
-
mockProvider1 = {
|
|
22
|
-
providerName: 'google',
|
|
23
|
-
getAuthUrl: jest.fn(),
|
|
24
|
-
handleCallback: jest.fn(),
|
|
25
|
-
verifyToken: jest.fn(),
|
|
26
|
-
linkAccount: jest.fn(),
|
|
27
|
-
getUserProfileFromCallback: jest.fn(),
|
|
28
|
-
} as any;
|
|
29
|
-
|
|
30
|
-
mockProvider2 = {
|
|
31
|
-
providerName: 'apple',
|
|
32
|
-
getAuthUrl: jest.fn(),
|
|
33
|
-
handleCallback: jest.fn(),
|
|
34
|
-
verifyToken: jest.fn(),
|
|
35
|
-
linkAccount: jest.fn(),
|
|
36
|
-
getUserProfileFromCallback: jest.fn(),
|
|
37
|
-
} as any;
|
|
38
|
-
|
|
39
|
-
// Instantiate service directly
|
|
40
|
-
service = new SocialAuthService();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
afterEach(() => {
|
|
44
|
-
jest.clearAllMocks();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// ============================================================================
|
|
48
|
-
// Service Initialization
|
|
49
|
-
// ============================================================================
|
|
50
|
-
|
|
51
|
-
it('should be defined', () => {
|
|
52
|
-
expect(service).toBeDefined();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// ============================================================================
|
|
56
|
-
// registerProvider() Method
|
|
57
|
-
// ============================================================================
|
|
58
|
-
|
|
59
|
-
describe('registerProvider', () => {
|
|
60
|
-
it('should register provider successfully', () => {
|
|
61
|
-
service.registerProvider(mockProvider1);
|
|
62
|
-
|
|
63
|
-
expect(service.hasProvider('google')).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should throw error when provider already registered', () => {
|
|
67
|
-
service.registerProvider(mockProvider1);
|
|
68
|
-
|
|
69
|
-
expect(() => service.registerProvider(mockProvider1)).toThrow(NAuthException);
|
|
70
|
-
expect(() => service.registerProvider(mockProvider1)).toThrow('already registered');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should allow multiple different providers', () => {
|
|
74
|
-
service.registerProvider(mockProvider1);
|
|
75
|
-
service.registerProvider(mockProvider2);
|
|
76
|
-
|
|
77
|
-
expect(service.hasProvider('google')).toBe(true);
|
|
78
|
-
expect(service.hasProvider('apple')).toBe(true);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should register provider with correct name', () => {
|
|
82
|
-
service.registerProvider(mockProvider1);
|
|
83
|
-
|
|
84
|
-
const provider = service.getProvider('google');
|
|
85
|
-
expect(provider).toBe(mockProvider1);
|
|
86
|
-
expect(provider.providerName).toBe('google');
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// ============================================================================
|
|
91
|
-
// getProvider() Method
|
|
92
|
-
// ============================================================================
|
|
93
|
-
|
|
94
|
-
describe('getProvider', () => {
|
|
95
|
-
it('should return registered provider', () => {
|
|
96
|
-
service.registerProvider(mockProvider1);
|
|
97
|
-
|
|
98
|
-
const provider = service.getProvider('google');
|
|
99
|
-
|
|
100
|
-
expect(provider).toBe(mockProvider1);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('should throw error when provider not registered', () => {
|
|
104
|
-
expect(() => service.getProvider('google')).toThrow(NAuthException);
|
|
105
|
-
expect(() => service.getProvider('google')).toThrow('not registered');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should throw error with helpful message suggesting module import', () => {
|
|
109
|
-
try {
|
|
110
|
-
service.getProvider('facebook');
|
|
111
|
-
fail('Should have thrown NAuthException');
|
|
112
|
-
} catch (error: any) {
|
|
113
|
-
expect(error).toBeInstanceOf(NAuthException);
|
|
114
|
-
expect(error.message).toContain('Import the provider module');
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('should use correct error code when provider not found', () => {
|
|
119
|
-
try {
|
|
120
|
-
service.getProvider('google');
|
|
121
|
-
} catch (error) {
|
|
122
|
-
expect(error).toBeInstanceOf(NAuthException);
|
|
123
|
-
expect((error as NAuthException).code).toBe(AuthErrorCode.SOCIAL_CONFIG_MISSING);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
// ============================================================================
|
|
129
|
-
// hasProvider() Method
|
|
130
|
-
// ============================================================================
|
|
131
|
-
|
|
132
|
-
describe('hasProvider', () => {
|
|
133
|
-
it('should return true for registered provider', () => {
|
|
134
|
-
service.registerProvider(mockProvider1);
|
|
135
|
-
|
|
136
|
-
expect(service.hasProvider('google')).toBe(true);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should return false for unregistered provider', () => {
|
|
140
|
-
expect(service.hasProvider('google')).toBe(false);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('should return false for provider that was never registered', () => {
|
|
144
|
-
service.registerProvider(mockProvider1);
|
|
145
|
-
|
|
146
|
-
expect(service.hasProvider('facebook')).toBe(false);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// ============================================================================
|
|
151
|
-
// listProviders() Method
|
|
152
|
-
// ============================================================================
|
|
153
|
-
|
|
154
|
-
describe('listProviders', () => {
|
|
155
|
-
it('should return empty array when no providers registered', () => {
|
|
156
|
-
expect(service.listProviders()).toEqual([]);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should return all registered provider names', () => {
|
|
160
|
-
service.registerProvider(mockProvider1);
|
|
161
|
-
service.registerProvider(mockProvider2);
|
|
162
|
-
|
|
163
|
-
const providers = service.listProviders();
|
|
164
|
-
|
|
165
|
-
expect(providers).toContain('google');
|
|
166
|
-
expect(providers).toContain('apple');
|
|
167
|
-
expect(providers.length).toBe(2);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('should return provider names in registration order', () => {
|
|
171
|
-
service.registerProvider(mockProvider1);
|
|
172
|
-
service.registerProvider(mockProvider2);
|
|
173
|
-
|
|
174
|
-
const providers = service.listProviders();
|
|
175
|
-
|
|
176
|
-
expect(providers[0]).toBe('google');
|
|
177
|
-
expect(providers[1]).toBe('apple');
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should return updated list after new provider registered', () => {
|
|
181
|
-
expect(service.listProviders()).toEqual([]);
|
|
182
|
-
|
|
183
|
-
service.registerProvider(mockProvider1);
|
|
184
|
-
expect(service.listProviders()).toEqual(['google']);
|
|
185
|
-
|
|
186
|
-
service.registerProvider(mockProvider2);
|
|
187
|
-
expect(service.listProviders()).toEqual(['google', 'apple']);
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// ============================================================================
|
|
192
|
-
// Integration Tests
|
|
193
|
-
// ============================================================================
|
|
194
|
-
|
|
195
|
-
describe('Integration', () => {
|
|
196
|
-
it('should allow full provider lifecycle', () => {
|
|
197
|
-
// Register
|
|
198
|
-
service.registerProvider(mockProvider1);
|
|
199
|
-
expect(service.hasProvider('google')).toBe(true);
|
|
200
|
-
|
|
201
|
-
// Get
|
|
202
|
-
const provider = service.getProvider('google');
|
|
203
|
-
expect(provider).toBe(mockProvider1);
|
|
204
|
-
|
|
205
|
-
// List
|
|
206
|
-
const providers = service.listProviders();
|
|
207
|
-
expect(providers).toContain('google');
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('should handle multiple providers independently', () => {
|
|
211
|
-
service.registerProvider(mockProvider1);
|
|
212
|
-
service.registerProvider(mockProvider2);
|
|
213
|
-
|
|
214
|
-
const googleProvider = service.getProvider('google');
|
|
215
|
-
const appleProvider = service.getProvider('apple');
|
|
216
|
-
|
|
217
|
-
expect(googleProvider).toBe(mockProvider1);
|
|
218
|
-
expect(appleProvider).toBe(mockProvider2);
|
|
219
|
-
expect(googleProvider).not.toBe(appleProvider);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('should maintain provider registry across operations', () => {
|
|
223
|
-
service.registerProvider(mockProvider1);
|
|
224
|
-
service.registerProvider(mockProvider2);
|
|
225
|
-
|
|
226
|
-
// Verify both still registered
|
|
227
|
-
expect(service.hasProvider('google')).toBe(true);
|
|
228
|
-
expect(service.hasProvider('apple')).toBe(true);
|
|
229
|
-
|
|
230
|
-
// Get both
|
|
231
|
-
const google = service.getProvider('google');
|
|
232
|
-
const apple = service.getProvider('apple');
|
|
233
|
-
|
|
234
|
-
expect(google).toBe(mockProvider1);
|
|
235
|
-
expect(apple).toBe(mockProvider2);
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
});
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { ISocialAuthProviderService } from '../interfaces/social-auth-provider.interface';
|
|
2
|
-
import { NAuthException } from '../exceptions/nauth.exception';
|
|
3
|
-
import { AuthErrorCode } from '../enums/error-codes.enum';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Social Provider Registry (Internal)
|
|
7
|
-
*
|
|
8
|
-
* Internal registry service for managing social authentication providers.
|
|
9
|
-
* This is an implementation detail used by SocialAuthService and provider modules.
|
|
10
|
-
*
|
|
11
|
-
* **Note:** This is an internal service. Consumer applications should use
|
|
12
|
-
* `SocialAuthService` instead, which provides a high-level API for social authentication.
|
|
13
|
-
*
|
|
14
|
-
* **Key Features:**
|
|
15
|
-
* - Dynamic provider registration without hardcoded names
|
|
16
|
-
* - Provider lookup by name
|
|
17
|
-
* - Auto-registration when provider modules are imported
|
|
18
|
-
*
|
|
19
|
-
* **How it works:**
|
|
20
|
-
* Provider modules (Google, Apple, Facebook, etc.) automatically register themselves
|
|
21
|
-
* with this registry using OnModuleInit when their modules are imported.
|
|
22
|
-
*
|
|
23
|
-
* @internal
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* // Provider modules auto-register
|
|
28
|
-
* onModuleInit() {
|
|
29
|
-
* this.providerRegistry.registerProvider(this);
|
|
30
|
-
* }
|
|
31
|
-
*
|
|
32
|
-
* // SocialAuthService uses the registry internally
|
|
33
|
-
* const provider = this.providerRegistry.getProvider('google');
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export class SocialProviderRegistry {
|
|
37
|
-
private readonly providers = new Map<string, ISocialAuthProviderService>();
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Register a social auth provider
|
|
41
|
-
*
|
|
42
|
-
* Called automatically by provider modules during initialization.
|
|
43
|
-
* Provider names must be unique.
|
|
44
|
-
*
|
|
45
|
-
* @param provider - Provider service instance (must have providerName property)
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* // In provider module OnModuleInit:
|
|
50
|
-
* constructor(private providerRegistry: SocialProviderRegistry) {}
|
|
51
|
-
*
|
|
52
|
-
* onModuleInit() {
|
|
53
|
-
* this.providerRegistry.registerProvider(this);
|
|
54
|
-
* }
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
registerProvider(provider: ISocialAuthProviderService): void {
|
|
58
|
-
const name = provider.providerName;
|
|
59
|
-
|
|
60
|
-
if (this.providers.has(name)) {
|
|
61
|
-
throw new NAuthException(AuthErrorCode.VALIDATION_FAILED, `Social auth provider '${name}' is already registered`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
this.providers.set(name, provider);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Get a provider by name
|
|
69
|
-
*
|
|
70
|
-
* @param name - Provider name (e.g., 'google', 'apple', 'facebook')
|
|
71
|
-
* @returns Provider service instance
|
|
72
|
-
* @throws {NAuthException} If provider is not registered
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```typescript
|
|
76
|
-
* const googleProvider = this.providerRegistry.getProvider('google');
|
|
77
|
-
* const authUrl = await googleProvider.getAuthUrl();
|
|
78
|
-
* ```
|
|
79
|
-
*/
|
|
80
|
-
getProvider(name: string): ISocialAuthProviderService {
|
|
81
|
-
const provider = this.providers.get(name);
|
|
82
|
-
if (!provider) {
|
|
83
|
-
throw new NAuthException(
|
|
84
|
-
AuthErrorCode.SOCIAL_CONFIG_MISSING,
|
|
85
|
-
`Social auth provider '${name}' is not registered. Import the provider module (e.g., GoogleSocialAuthModule) and ensure it's properly configured.`,
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
return provider;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Check if a provider is registered
|
|
93
|
-
*
|
|
94
|
-
* @param name - Provider name
|
|
95
|
-
* @returns True if provider exists
|
|
96
|
-
*
|
|
97
|
-
* @example
|
|
98
|
-
* ```typescript
|
|
99
|
-
* if (this.providerRegistry.hasProvider('github')) {
|
|
100
|
-
* // Use GitHub provider
|
|
101
|
-
* }
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
hasProvider(name: string): boolean {
|
|
105
|
-
return this.providers.has(name);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Get all registered provider names
|
|
110
|
-
*
|
|
111
|
-
* @returns Array of provider names
|
|
112
|
-
*
|
|
113
|
-
* @example
|
|
114
|
-
* ```typescript
|
|
115
|
-
* const providers = this.providerRegistry.listProviders();
|
|
116
|
-
* // ['google', 'apple', 'facebook']
|
|
117
|
-
* ```
|
|
118
|
-
*/
|
|
119
|
-
listProviders(): string[] {
|
|
120
|
-
return Array.from(this.providers.keys());
|
|
121
|
-
}
|
|
122
|
-
}
|