@memberjunction/ng-auth-services 2.129.0 → 2.130.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.
Files changed (27) hide show
  1. package/dist/lib/IAuthProvider.d.ts +177 -17
  2. package/dist/lib/IAuthProvider.d.ts.map +1 -1
  3. package/dist/lib/auth-types.d.ts +351 -0
  4. package/dist/lib/auth-types.d.ts.map +1 -0
  5. package/dist/lib/auth-types.js +98 -0
  6. package/dist/lib/auth-types.js.map +1 -0
  7. package/dist/lib/mjexplorer-auth-base.service.d.ts +204 -49
  8. package/dist/lib/mjexplorer-auth-base.service.d.ts.map +1 -1
  9. package/dist/lib/mjexplorer-auth-base.service.js +173 -67
  10. package/dist/lib/mjexplorer-auth-base.service.js.map +1 -1
  11. package/dist/lib/providers/mjexplorer-auth0-provider.service.d.ts +61 -17
  12. package/dist/lib/providers/mjexplorer-auth0-provider.service.d.ts.map +1 -1
  13. package/dist/lib/providers/mjexplorer-auth0-provider.service.js +245 -76
  14. package/dist/lib/providers/mjexplorer-auth0-provider.service.js.map +1 -1
  15. package/dist/lib/providers/mjexplorer-msal-provider.service.d.ts +57 -16
  16. package/dist/lib/providers/mjexplorer-msal-provider.service.d.ts.map +1 -1
  17. package/dist/lib/providers/mjexplorer-msal-provider.service.js +311 -114
  18. package/dist/lib/providers/mjexplorer-msal-provider.service.js.map +1 -1
  19. package/dist/lib/providers/mjexplorer-okta-provider.service.d.ts +55 -30
  20. package/dist/lib/providers/mjexplorer-okta-provider.service.d.ts.map +1 -1
  21. package/dist/lib/providers/mjexplorer-okta-provider.service.js +263 -235
  22. package/dist/lib/providers/mjexplorer-okta-provider.service.js.map +1 -1
  23. package/dist/public-api.d.ts +1 -0
  24. package/dist/public-api.d.ts.map +1 -1
  25. package/dist/public-api.js +2 -0
  26. package/dist/public-api.js.map +1 -1
  27. package/package.json +3 -3
@@ -1,24 +1,32 @@
1
1
  import { MJAuthBase } from '../mjexplorer-auth-base.service';
2
- import { AuthService, User, AuthGuard, Auth0ClientFactory, AuthClientConfig } from '@auth0/auth0-angular';
3
- import { Observable } from 'rxjs';
2
+ import { AuthService, AuthGuard, Auth0ClientFactory, AuthClientConfig } from '@auth0/auth0-angular';
3
+ import { StandardUserInfo, StandardAuthToken, StandardAuthError, TokenRefreshResult } from '../auth-types';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare function LoadMJAuth0Provider(): void;
6
+ /**
7
+ * Auth0 authentication provider implementation - v3.0.0
8
+ *
9
+ * Implements the abstract methods from MJAuthBase to hide Auth0-specific details.
10
+ * The key abstraction is that Auth0 stores the JWT in `idTokenClaims.__raw`,
11
+ * but consumers never need to know this detail.
12
+ */
6
13
  export declare class MJAuth0Provider extends MJAuthBase {
7
14
  auth: AuthService;
8
15
  static readonly PROVIDER_TYPE = "auth0";
9
- type: string;
16
+ readonly type = "auth0";
10
17
  private _initialized;
11
18
  /**
12
19
  * Factory function to provide Angular dependencies required by Auth0
13
20
  * Stored as a static property for the factory to access without instantiation
14
21
  */
15
- static angularProviderFactory: (environment: any) => (typeof AuthService | typeof AuthGuard | {
22
+ static angularProviderFactory: (environment: Record<string, unknown>) => (typeof AuthService | typeof AuthGuard | {
16
23
  provide: import("@angular/core").InjectionToken<import("@auth0/auth0-angular").AuthConfig>;
17
24
  useValue: {
18
- domain: any;
19
- clientId: any;
25
+ domain: unknown;
26
+ clientId: unknown;
20
27
  authorizationParams: {
21
28
  redirect_uri: string;
29
+ scope: string;
22
30
  };
23
31
  cacheLocation: string;
24
32
  useRefreshTokens: boolean;
@@ -33,20 +41,56 @@ export declare class MJAuth0Provider extends MJAuthBase {
33
41
  useValue?: undefined;
34
42
  })[];
35
43
  constructor(auth: AuthService);
36
- login(options?: any): Observable<void>;
37
- private ensureInitialized;
38
- logout(): Promise<void>;
39
- refresh(): Promise<Observable<any>>;
40
- getUser(): Promise<Observable<User | null | undefined>>;
41
- isAuthenticated(): Observable<boolean>;
42
- getUserClaims(): Promise<Observable<any>>;
43
- checkExpiredTokenError(error: string): boolean;
44
44
  initialize(): Promise<void>;
45
- protected loginInternal(options?: any): Promise<void>;
46
- getToken(): Promise<string | null>;
45
+ protected loginInternal(options?: Record<string, unknown>): Promise<void>;
46
+ logout(): Promise<void>;
47
47
  handleCallback(): Promise<void>;
48
+ /**
49
+ * Extract ID token from Auth0's storage
50
+ *
51
+ * Auth0 stores the JWT string in idTokenClaims.__raw
52
+ * This is the key abstraction - consumers never need to know about __raw!
53
+ */
54
+ protected extractIdTokenInternal(): Promise<string | null>;
55
+ /**
56
+ * Extract complete token info from Auth0
57
+ *
58
+ * Maps Auth0's token structure to StandardAuthToken
59
+ */
60
+ protected extractTokenInfoInternal(): Promise<StandardAuthToken | null>;
61
+ /**
62
+ * Extract user info from Auth0 claims
63
+ *
64
+ * Maps Auth0's user object structure to StandardUserInfo
65
+ */
66
+ protected extractUserInfoInternal(): Promise<StandardUserInfo | null>;
67
+ /**
68
+ * Refresh token using Auth0's silent authentication
69
+ *
70
+ * Uses cacheMode: 'off' to bypass cache and force token refresh
71
+ * With useRefreshTokens: true and offline_access scope, this will use refresh tokens
72
+ */
73
+ protected refreshTokenInternal(): Promise<TokenRefreshResult>;
74
+ /**
75
+ * Classify Auth0-specific errors into semantic types
76
+ *
77
+ * Maps Auth0 error patterns to AuthErrorType enum
78
+ */
79
+ protected classifyErrorInternal(error: unknown): StandardAuthError;
80
+ private ensureInitialized;
81
+ /**
82
+ * Map Auth0 User object to StandardUserInfo
83
+ */
84
+ private mapAuth0UserToStandard;
85
+ /**
86
+ * Get profile picture URL from Auth0
87
+ *
88
+ * Auth0 includes the picture URL directly in user claims.
89
+ * No additional API call needed.
90
+ */
91
+ protected getProfilePictureUrlInternal(): Promise<string | null>;
48
92
  getRequiredConfig(): string[];
49
- validateConfig(_config: any): boolean;
93
+ validateConfig(_config: Record<string, unknown>): boolean;
50
94
  static ɵfac: i0.ɵɵFactoryDeclaration<MJAuth0Provider, never>;
51
95
  static ɵprov: i0.ɵɵInjectableDeclaration<MJAuth0Provider>;
52
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mjexplorer-auth0-provider.service.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-auth0-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAW,IAAI,EAAE,SAAS,EAAyC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1J,OAAO,EAAE,UAAU,EAAsB,MAAM,MAAM,CAAC;;AAKtD,wBAAgB,mBAAmB,SAClC;AAED,qBAIa,eAAgB,SAAQ,UAAU;IAoC1B,IAAI,EAAE,WAAW;IAnCpC,MAAM,CAAC,QAAQ,CAAC,aAAa,WAAW;IACxC,IAAI,SAAiC;IACrC,OAAO,CAAC,YAAY,CAAS;IAE7B;;;OAGG;IACH,MAAM,CAAC,sBAAsB,gBAAiB,GAAG;;;;;;;;;;;;;;;;;;;SAyB/C;gBAEiB,IAAI,EAAE,WAAW;IAS3B,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;YASjC,iBAAiB;IAMlB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAmC1C,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAIpD,eAAe,IAAI,UAAU,CAAC,OAAO,CAAC;IAMzC,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAe/C,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;cAcjB,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUlC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;yCAtK1B,eAAe;6CAAf,eAAe;CA2K3B"}
1
+ {"version":3,"file":"mjexplorer-auth0-provider.service.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-auth0-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAiB,SAAS,EAAyC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI1J,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAEjB,kBAAkB,EACnB,MAAM,eAAe,CAAC;;AAGvB,wBAAgB,mBAAmB,SAClC;AAED;;;;;;GAMG;AACH,qBAIa,eAAgB,SAAQ,UAAU;IAqC1B,IAAI,EAAE,WAAW;IApCpC,MAAM,CAAC,QAAQ,CAAC,aAAa,WAAW;IACxC,QAAQ,CAAC,IAAI,WAAiC;IAC9C,OAAO,CAAC,YAAY,CAAS;IAE7B;;;OAGG;IACH,MAAM,CAAC,sBAAsB,gBAAiB,OAAO,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;SA0BnE;gBAEiB,IAAI,EAAE,WAAW;IAY9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;cA0CjB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC;;;;;OAKG;cACa,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWhE;;;;OAIG;cACa,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAuB7E;;;;OAIG;cACa,uBAAuB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAc3E;;;;;OAKG;cACa,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA6CnE;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB;YAgEpD,iBAAiB;IAM/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;;;;OAKG;cACa,4BAA4B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc7D,iBAAiB,IAAI,MAAM,EAAE;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;yCApVvD,eAAe;6CAAf,eAAe;CAwV3B"}
@@ -9,12 +9,21 @@ import { Injectable } from '@angular/core';
9
9
  import { RegisterClass } from '@memberjunction/global';
10
10
  import { MJAuthBase } from '../mjexplorer-auth-base.service';
11
11
  import { AuthService, AuthGuard, AuthConfigService, Auth0ClientService, Auth0ClientFactory, AuthClientConfig } from '@auth0/auth0-angular';
12
- import { of, firstValueFrom } from 'rxjs';
12
+ import { firstValueFrom } from 'rxjs';
13
+ import { take, filter } from 'rxjs/operators';
14
+ import { AuthErrorType } from '../auth-types';
13
15
  import * as i0 from "@angular/core";
14
16
  import * as i1 from "@auth0/auth0-angular";
15
17
  // Prevent tree-shaking by explicitly referencing the class
16
18
  export function LoadMJAuth0Provider() {
17
19
  }
20
+ /**
21
+ * Auth0 authentication provider implementation - v3.0.0
22
+ *
23
+ * Implements the abstract methods from MJAuthBase to hide Auth0-specific details.
24
+ * The key abstraction is that Auth0 stores the JWT in `idTokenClaims.__raw`,
25
+ * but consumers never need to know this detail.
26
+ */
18
27
  let MJAuth0Provider = class MJAuth0Provider extends MJAuthBase {
19
28
  static { MJAuth0Provider_1 = this; }
20
29
  auth;
@@ -31,10 +40,11 @@ let MJAuth0Provider = class MJAuth0Provider extends MJAuthBase {
31
40
  {
32
41
  provide: AuthConfigService,
33
42
  useValue: {
34
- domain: environment.AUTH0_DOMAIN,
35
- clientId: environment.AUTH0_CLIENTID,
43
+ domain: environment['AUTH0_DOMAIN'],
44
+ clientId: environment['AUTH0_CLIENTID'],
36
45
  authorizationParams: {
37
46
  redirect_uri: window.location.origin,
47
+ scope: 'openid profile email offline_access',
38
48
  // No audience parameter - uses ID tokens (matches pre-refactor behavior)
39
49
  // ID tokens have aud=clientId by default and contain user claims
40
50
  },
@@ -58,109 +68,268 @@ let MJAuth0Provider = class MJAuth0Provider extends MJAuthBase {
58
68
  };
59
69
  super(config);
60
70
  this.auth = auth;
61
- // Defer subscription to avoid blocking app startup
62
71
  }
63
- login(options) {
64
- // Ensure initialized before login
65
- this.ensureInitialized();
66
- // Auth0's loginWithRedirect executes immediately
67
- this.auth.loginWithRedirect(options);
68
- // Return an observable for backward compatibility
69
- return of(void 0);
70
- }
71
- async ensureInitialized() {
72
- if (!this._initialized) {
73
- await this.initialize();
72
+ // ============================================================================
73
+ // LIFECYCLE METHODS
74
+ // ============================================================================
75
+ async initialize() {
76
+ if (this._initialized) {
77
+ return;
74
78
  }
79
+ // CRITICAL: Wait for Auth0 SDK to process any redirect callback
80
+ // The SDK handles this internally and updates isLoading$ when done
81
+ await firstValueFrom(this.auth.isLoading$.pipe(filter(loading => !loading), take(1)));
82
+ // Get current authentication state
83
+ const isAuthenticated = await firstValueFrom(this.auth.isAuthenticated$);
84
+ // CRITICAL: Get current user BEFORE setting up subscriptions
85
+ // This ensures userInfo$ has a value before app.component.ts subscribes
86
+ if (isAuthenticated) {
87
+ const user = await firstValueFrom(this.auth.user$);
88
+ if (user) {
89
+ const userInfo = this.mapAuth0UserToStandard(user);
90
+ this.updateUserInfo(userInfo);
91
+ }
92
+ }
93
+ // Subscribe to authentication state and user info for future changes
94
+ this.auth.isAuthenticated$.subscribe((loggedIn) => {
95
+ this.updateAuthState(loggedIn);
96
+ });
97
+ this.auth.user$.subscribe((user) => {
98
+ if (user) {
99
+ const userInfo = this.mapAuth0UserToStandard(user);
100
+ this.updateUserInfo(userInfo);
101
+ }
102
+ else {
103
+ this.updateUserInfo(null);
104
+ }
105
+ });
106
+ this._initialized = true;
107
+ }
108
+ async loginInternal(options) {
109
+ await this.ensureInitialized();
110
+ this.auth.loginWithRedirect(options);
75
111
  }
76
112
  async logout() {
77
113
  this.auth.logout({ logoutParams: { returnTo: document.location.origin } });
78
114
  }
79
- async refresh() {
115
+ async handleCallback() {
116
+ // Auth0 Angular SDK handles callbacks internally via interceptors
117
+ // This method exists for interface compatibility
118
+ }
119
+ // ============================================================================
120
+ // ABSTRACT METHOD IMPLEMENTATIONS (v3.0.0)
121
+ // ============================================================================
122
+ /**
123
+ * Extract ID token from Auth0's storage
124
+ *
125
+ * Auth0 stores the JWT string in idTokenClaims.__raw
126
+ * This is the key abstraction - consumers never need to know about __raw!
127
+ */
128
+ async extractIdTokenInternal() {
129
+ try {
130
+ const claims = await firstValueFrom(this.auth.idTokenClaims$);
131
+ // Auth0-specific detail: JWT is in __raw property
132
+ return claims?.__raw || null;
133
+ }
134
+ catch (error) {
135
+ console.error('[Auth0] Error extracting ID token:', error);
136
+ return null;
137
+ }
138
+ }
139
+ /**
140
+ * Extract complete token info from Auth0
141
+ *
142
+ * Maps Auth0's token structure to StandardAuthToken
143
+ */
144
+ async extractTokenInfoInternal() {
145
+ try {
146
+ const claims = await firstValueFrom(this.auth.idTokenClaims$);
147
+ if (!claims) {
148
+ return null;
149
+ }
150
+ const idToken = claims.__raw;
151
+ if (!idToken) {
152
+ return null;
153
+ }
154
+ return {
155
+ idToken,
156
+ expiresAt: claims.exp ? claims.exp * 1000 : 0, // Convert to milliseconds
157
+ scopes: claims.scope ? claims.scope.split(' ') : undefined
158
+ };
159
+ }
160
+ catch (error) {
161
+ console.error('[Auth0] Error extracting token info:', error);
162
+ return null;
163
+ }
164
+ }
165
+ /**
166
+ * Extract user info from Auth0 claims
167
+ *
168
+ * Maps Auth0's user object structure to StandardUserInfo
169
+ */
170
+ async extractUserInfoInternal() {
171
+ try {
172
+ const user = await firstValueFrom(this.auth.user$);
173
+ if (!user) {
174
+ return null;
175
+ }
176
+ return this.mapAuth0UserToStandard(user);
177
+ }
178
+ catch (error) {
179
+ console.error('[Auth0] Error extracting user info:', error);
180
+ return null;
181
+ }
182
+ }
183
+ /**
184
+ * Refresh token using Auth0's silent authentication
185
+ *
186
+ * Uses cacheMode: 'off' to bypass cache and force token refresh
187
+ * With useRefreshTokens: true and offline_access scope, this will use refresh tokens
188
+ */
189
+ async refreshTokenInternal() {
80
190
  try {
81
- console.log('[Auth0] refresh() - Attempting to refresh session...');
82
- // Force token refresh using refresh tokens (if available) or silent auth
83
- // ignoreCache forces fetching new tokens instead of returning cached ones
191
+ console.log('[Auth0] Attempting to refresh token...');
192
+ // Force token refresh by bypassing cache
193
+ // With useRefreshTokens: true and offline_access scope, this will use refresh tokens
84
194
  await firstValueFrom(this.auth.getAccessTokenSilently({
85
- cacheMode: 'off',
86
- authorizationParams: {
87
- ignoreCache: true
88
- }
195
+ cacheMode: 'off'
89
196
  }));
90
- console.log('[Auth0] refresh() - getAccessTokenSilently completed');
91
- // Small delay to ensure Auth0 SDK has updated idTokenClaims$ observable
197
+ // Small delay to ensure Auth0 SDK has updated observables
92
198
  await new Promise(resolve => setTimeout(resolve, 100));
93
- // Get fresh ID token claims after session refresh
94
- const freshClaims = await firstValueFrom(this.auth.idTokenClaims$);
95
- console.log('[Auth0] refresh() - Got fresh ID token', {
96
- exp: freshClaims?.exp,
97
- expiryDate: freshClaims?.exp ? new Date(freshClaims.exp * 1000).toISOString() : 'N/A'
199
+ // Extract fresh token info from updated observables
200
+ const token = await this.extractTokenInfoInternal();
201
+ if (!token) {
202
+ return {
203
+ success: false,
204
+ error: {
205
+ type: AuthErrorType.NO_ACTIVE_SESSION,
206
+ message: 'Token refresh succeeded but could not extract token info',
207
+ userMessage: 'Session refresh failed. Please log in again.'
208
+ }
209
+ };
210
+ }
211
+ console.log('[Auth0] Token refresh successful', {
212
+ expiresAt: new Date(token.expiresAt).toISOString()
98
213
  });
99
- // Return the fresh claims
100
- return of(freshClaims);
214
+ return {
215
+ success: true,
216
+ token
217
+ };
101
218
  }
102
219
  catch (error) {
103
- console.error('[Auth0] refresh() - Session refresh failed:', error);
104
- // Re-throw to trigger re-login
105
- throw error;
220
+ console.error('[Auth0] Token refresh failed:', error);
221
+ return {
222
+ success: false,
223
+ error: this.classifyErrorInternal(error)
224
+ };
106
225
  }
107
226
  }
108
- async getUser() {
109
- return this.auth.user$;
110
- }
111
- isAuthenticated() {
112
- // Don't initialize just for checking auth state
113
- // Auth0 SDK handles this internally
114
- return this.auth.isAuthenticated$;
115
- }
116
- async getUserClaims() {
117
- await this.ensureInitialized();
118
- console.log('[Auth0] getUserClaims: Getting ID token claims...');
119
- // Get ID token claims (matches pre-refactor behavior)
120
- // These always contain user information
121
- const idTokenClaims = await firstValueFrom(this.auth.idTokenClaims$);
122
- console.log('[Auth0] Got ID token claims');
123
- // Return claims with __raw containing the JWT string
124
- return of(idTokenClaims);
125
- }
126
- checkExpiredTokenError(error) {
127
- return error?.includes('jwt expired');
227
+ /**
228
+ * Classify Auth0-specific errors into semantic types
229
+ *
230
+ * Maps Auth0 error patterns to AuthErrorType enum
231
+ */
232
+ classifyErrorInternal(error) {
233
+ const errorObj = error;
234
+ const message = errorObj?.['message'] || 'Unknown error';
235
+ const errorType = errorObj?.['error'] || '';
236
+ // Check for specific Auth0 error patterns
237
+ if (message.includes('jwt expired') || message.includes('token expired')) {
238
+ return {
239
+ type: AuthErrorType.TOKEN_EXPIRED,
240
+ message,
241
+ originalError: error,
242
+ userMessage: 'Your session has expired. Please log in again.'
243
+ };
244
+ }
245
+ if (errorType === 'login_required' || message.includes('login_required')) {
246
+ return {
247
+ type: AuthErrorType.NO_ACTIVE_SESSION,
248
+ message,
249
+ originalError: error,
250
+ userMessage: 'You need to log in to continue.'
251
+ };
252
+ }
253
+ if (errorType === 'consent_required' || message.includes('consent_required')) {
254
+ return {
255
+ type: AuthErrorType.INTERACTION_REQUIRED,
256
+ message,
257
+ originalError: error,
258
+ userMessage: 'Additional permissions are required. Please log in again.'
259
+ };
260
+ }
261
+ if (message.includes('user closed') || message.includes('cancelled')) {
262
+ return {
263
+ type: AuthErrorType.USER_CANCELLED,
264
+ message,
265
+ originalError: error,
266
+ userMessage: 'Login was cancelled.'
267
+ };
268
+ }
269
+ if (message.includes('network') || message.includes('fetch')) {
270
+ return {
271
+ type: AuthErrorType.NETWORK_ERROR,
272
+ message,
273
+ originalError: error,
274
+ userMessage: 'Network error. Please check your connection and try again.'
275
+ };
276
+ }
277
+ // Default to unknown error
278
+ return {
279
+ type: AuthErrorType.UNKNOWN_ERROR,
280
+ message,
281
+ originalError: error,
282
+ userMessage: 'An unexpected error occurred. Please try again.'
283
+ };
128
284
  }
129
- // Add required methods for the new interface
130
- async initialize() {
131
- if (this._initialized) {
132
- return;
285
+ // ============================================================================
286
+ // HELPER METHODS
287
+ // ============================================================================
288
+ async ensureInitialized() {
289
+ if (!this._initialized) {
290
+ await this.initialize();
133
291
  }
134
- // Auth0 Angular SDK handles initialization internally
135
- // Just subscribe to authentication state once
136
- this.auth.isAuthenticated$.subscribe((loggedIn) => {
137
- this.updateAuthState(loggedIn);
138
- });
139
- this._initialized = true;
140
292
  }
141
- async loginInternal(options) {
142
- this.auth.loginWithRedirect(options);
293
+ /**
294
+ * Map Auth0 User object to StandardUserInfo
295
+ */
296
+ mapAuth0UserToStandard(user) {
297
+ return {
298
+ id: user.sub || '',
299
+ email: user.email || '',
300
+ name: user.name || '',
301
+ givenName: user.given_name,
302
+ familyName: user.family_name,
303
+ preferredUsername: user.nickname,
304
+ pictureUrl: user.picture,
305
+ locale: user.locale,
306
+ emailVerified: user.email_verified
307
+ };
143
308
  }
144
- async getToken() {
309
+ /**
310
+ * Get profile picture URL from Auth0
311
+ *
312
+ * Auth0 includes the picture URL directly in user claims.
313
+ * No additional API call needed.
314
+ */
315
+ async getProfilePictureUrlInternal() {
145
316
  try {
146
- const token = await firstValueFrom(this.auth.getAccessTokenSilently());
147
- return token || null;
317
+ const user = await firstValueFrom(this.auth.user$);
318
+ return user?.picture || null;
148
319
  }
149
320
  catch (error) {
150
- console.error('Error getting Auth0 token:', error);
321
+ console.error('[Auth0] Error getting profile picture:', error);
151
322
  return null;
152
323
  }
153
324
  }
154
- async handleCallback() {
155
- // Auth0 Angular SDK handles callbacks internally
156
- // This method is here for interface compatibility
157
- }
325
+ // ============================================================================
326
+ // CONFIGURATION
327
+ // ============================================================================
158
328
  getRequiredConfig() {
159
329
  return ['clientId', 'domain'];
160
330
  }
161
331
  validateConfig(_config) {
162
332
  // Auth0 configuration is handled by Angular module providers
163
- // Prefix with underscore to indicate intentionally unused
164
333
  return true;
165
334
  }
166
335
  static ɵfac = function MJAuth0Provider_Factory(t) { return new (t || MJAuth0Provider)(i0.ɵɵinject(i1.AuthService)); };
@@ -1 +1 @@
1
- {"version":3,"file":"mjexplorer-auth0-provider.service.js","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-auth0-provider.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mjexplorer-auth0-provider.service.js","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-auth0-provider.service.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,22 @@
1
1
  import { OnDestroy } from '@angular/core';
2
2
  import { MJAuthBase } from '../mjexplorer-auth-base.service';
3
- import { Observable } from 'rxjs';
4
3
  import { MsalBroadcastService, MsalService, MsalGuard } from '@azure/msal-angular';
5
- import { AccountInfo } from '@azure/msal-common';
6
4
  import { PublicClientApplication, InteractionType } from '@azure/msal-browser';
5
+ import { StandardUserInfo, StandardAuthToken, StandardAuthError, TokenRefreshResult } from '../auth-types';
7
6
  import * as i0 from "@angular/core";
8
7
  export declare function LoadMJMSALProvider(): void;
8
+ /**
9
+ * MSAL (Microsoft Authentication Library) provider implementation - v3.0.0
10
+ *
11
+ * Implements the abstract methods from MJAuthBase to hide MSAL-specific details.
12
+ * The key abstraction is that MSAL stores the JWT in AuthenticationResult.idToken,
13
+ * but consumers never need to know this detail.
14
+ */
9
15
  export declare class MJMSALProvider extends MJAuthBase implements OnDestroy {
10
16
  auth: MsalService;
11
17
  private msalBroadcastService;
12
18
  static readonly PROVIDER_TYPE = "msal";
13
- type: string;
19
+ readonly type = "msal";
14
20
  private readonly _destroying$;
15
21
  private readonly _initializationCompleted$;
16
22
  private _initPromise;
@@ -18,7 +24,7 @@ export declare class MJMSALProvider extends MJAuthBase implements OnDestroy {
18
24
  * Factory function to provide Angular dependencies required by MSAL
19
25
  * Stored as a static property for the factory to access without instantiation
20
26
  */
21
- static angularProviderFactory: (environment: any) => (typeof MsalService | typeof MsalBroadcastService | typeof MsalGuard | {
27
+ static angularProviderFactory: (environment: Record<string, unknown>) => (typeof MsalService | typeof MsalBroadcastService | typeof MsalGuard | {
22
28
  provide: import("@angular/core").InjectionToken<string>;
23
29
  useValue: PublicClientApplication;
24
30
  } | {
@@ -39,22 +45,57 @@ export declare class MJMSALProvider extends MJAuthBase implements OnDestroy {
39
45
  };
40
46
  })[];
41
47
  constructor(auth: MsalService, msalBroadcastService: MsalBroadcastService);
42
- private initializeMSAL;
48
+ initialize(): Promise<void>;
43
49
  private _performInitialization;
44
- private ensureInitialized;
45
- login(options?: any): Observable<void>;
50
+ protected loginInternal(options?: Record<string, unknown>): Promise<void>;
46
51
  logout(): Promise<void>;
47
- refresh(): Promise<Observable<any>>;
48
- getUser(): Promise<AccountInfo | null>;
49
- isAuthenticated(): Observable<boolean>;
50
- getUserClaims(): Promise<Observable<any>>;
51
- checkExpiredTokenError(error: string): boolean;
52
- initialize(): Promise<void>;
53
- protected loginInternal(options?: any): Promise<void>;
54
- getToken(): Promise<string | null>;
55
52
  handleCallback(): Promise<void>;
53
+ /**
54
+ * Extract ID token from MSAL's storage
55
+ *
56
+ * MSAL stores the JWT in AuthenticationResult.idToken
57
+ * This is the key abstraction - consumers never need to know about MSAL's structure!
58
+ */
59
+ protected extractIdTokenInternal(): Promise<string | null>;
60
+ /**
61
+ * Extract complete token info from MSAL
62
+ *
63
+ * Maps MSAL's AuthenticationResult to StandardAuthToken
64
+ */
65
+ protected extractTokenInfoInternal(): Promise<StandardAuthToken | null>;
66
+ /**
67
+ * Extract user info from MSAL account
68
+ *
69
+ * Maps MSAL's AccountInfo structure to StandardUserInfo
70
+ */
71
+ protected extractUserInfoInternal(): Promise<StandardUserInfo | null>;
72
+ /**
73
+ * Refresh token using MSAL's silent token acquisition
74
+ *
75
+ * Uses acquireTokenSilent with forceRefresh to get new tokens
76
+ */
77
+ protected refreshTokenInternal(): Promise<TokenRefreshResult>;
78
+ /**
79
+ * Classify MSAL-specific errors into semantic types
80
+ *
81
+ * Maps MSAL error classes to AuthErrorType enum
82
+ */
83
+ protected classifyErrorInternal(error: unknown): StandardAuthError;
84
+ private ensureInitialized;
85
+ /**
86
+ * Map MSAL AccountInfo to StandardUserInfo
87
+ */
88
+ private mapMSALAccountToStandard;
89
+ /**
90
+ * Get profile picture URL from Microsoft Graph API
91
+ *
92
+ * MSAL requires fetching the photo from Microsoft Graph.
93
+ * This is the key advantage of encapsulation - consumers don't need
94
+ * to know about Graph API, they just call getProfilePictureUrl()!
95
+ */
96
+ protected getProfilePictureUrlInternal(): Promise<string | null>;
56
97
  getRequiredConfig(): string[];
57
- validateConfig(_config: any): boolean;
98
+ validateConfig(_config: Record<string, unknown>): boolean;
58
99
  ngOnDestroy(): void;
59
100
  static ɵfac: i0.ɵɵFactoryDeclaration<MJMSALProvider, never>;
60
101
  static ɵprov: i0.ɵɵInjectableDeclaration<MJMSALProvider>;
@@ -1 +1 @@
1
- {"version":3,"file":"mjexplorer-msal-provider.service.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-msal-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAmB,UAAU,EAA2F,MAAM,MAAM,CAAC;AAC5I,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAA6D,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9I,OAAO,EAAE,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAsE,uBAAuB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;;AAKnJ,wBAAgB,kBAAkB,SACjC;AAED,qBAIa,cAAe,SAAQ,UAAW,YAAW,SAAS;IAgD9C,IAAI,EAAE,WAAW;IAAE,OAAO,CAAC,oBAAoB;IA/ClE,MAAM,CAAC,QAAQ,CAAC,aAAa,UAAU;IACvC,IAAI,SAAgC;IAEpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAuC;IACjF,OAAO,CAAC,YAAY,CAA8B;IAElD;;;OAGG;IACH,MAAM,CAAC,sBAAsB,gBAAiB,GAAG;;;;;;;;;;;;;;;;;;;SAkC/C;gBAEiB,IAAI,EAAE,WAAW,EAAU,oBAAoB,EAAE,oBAAoB;YAU1E,cAAc;YAUd,sBAAsB;YAuCtB,iBAAiB;IAUtB,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;IAmBlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAS1C,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKnC,eAAe,IAAI,UAAU,CAAC,OAAO,CAAC;IAKzC,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IA+B/C,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;cAIjB,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8BlC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAKrC,WAAW,IAAI,IAAI;yCA3QR,cAAc;6CAAd,cAAc;CAyR1B"}
1
+ {"version":3,"file":"mjexplorer-msal-provider.service.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/mjexplorer-msal-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAA6D,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE9I,OAAO,EAAsE,uBAAuB,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAGrK,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAEjB,kBAAkB,EACnB,MAAM,eAAe,CAAC;;AAGvB,wBAAgB,kBAAkB,SACjC;AAED;;;;;;GAMG;AACH,qBAIa,cAAe,SAAQ,UAAW,YAAW,SAAS;IAgD9C,IAAI,EAAE,WAAW;IAAE,OAAO,CAAC,oBAAoB;IA/ClE,MAAM,CAAC,QAAQ,CAAC,aAAa,UAAU;IACvC,QAAQ,CAAC,IAAI,UAAgC;IAE7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAuC;IACjF,OAAO,CAAC,YAAY,CAA8B;IAElD;;;OAGG;IACH,MAAM,CAAC,sBAAsB,gBAAiB,OAAO,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;SAkCnE;gBAEiB,IAAI,EAAE,WAAW,EAAU,oBAAoB,EAAE,oBAAoB;IAYlF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YASnB,sBAAsB;cAwDpB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBzE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC;;;;;OAKG;cACa,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+BhE;;;;OAIG;cACa,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA4C7E;;;;OAIG;cACa,uBAAuB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAgB3E;;;;OAIG;cACa,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAuDnE;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB;YA2EpD,iBAAiB;IAQ/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;;;;;OAMG;cACa,4BAA4B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyC7D,iBAAiB,IAAI,MAAM,EAAE;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IASlE,WAAW,IAAI,IAAI;yCA9eR,cAAc;6CAAd,cAAc;CAof1B"}