@nauth-toolkit/social-facebook 0.1.77 → 0.1.78

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.
@@ -66,6 +66,6 @@ export declare class FacebookSocialAuthService extends BaseSocialAuthProviderSer
66
66
  * @returns User profile from verified token
67
67
  * @protected
68
68
  */
69
- protected verifyNativeToken(idToken: string, _accessToken?: string, profileData?: unknown): Promise<OAuthUserProfile>;
69
+ protected verifyNativeToken(idToken: string, accessToken?: string, profileData?: unknown): Promise<OAuthUserProfile>;
70
70
  }
71
71
  //# sourceMappingURL=facebook-social-auth.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-social-auth.service.d.ts","sourceRoot":"","sources":["../../src/facebook-social-auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAGhB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,QAAQ,EACR,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAAE,sCAAsC;AACxD,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,yBAA0B,SAAQ,6BAA8B,YAAW,0BAA0B;IAChH,QAAQ,CAAC,YAAY,cAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAG3D,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,0BAA0B,EAC3C,iBAAiB,EAAE,iBAAiB,EAEpC,UAAU,EAAE,qBAAqB,EACjC,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,EAEpC,wBAAwB,CAAC,EAAE,wBAAwB,EAEnD,YAAY,CAAC,EAAE,gBAAgB,EAE/B,oBAAoB,CAAC,EAAE,oBAAoB,EAE3C,YAAY,CAAC,EAAE,mBAAmB,EAElC,aAAa,CAAC,EAAE,qBAAqB;IAoDvC;;;;;OAKG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjD;;;;;;;;;OASG;cACa,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgBxF;;;;;;;;;;OAUG;cACa,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,gBAAgB,CAAC;CAsD7B"}
1
+ {"version":3,"file":"facebook-social-auth.service.d.ts","sourceRoot":"","sources":["../../src/facebook-social-auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAGhB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,QAAQ,EACR,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAAE,sCAAsC;AACxD,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAmBrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,yBAA0B,SAAQ,6BAA8B,YAAW,0BAA0B;IAChH,QAAQ,CAAC,YAAY,cAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAG3D,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,0BAA0B,EAC3C,iBAAiB,EAAE,iBAAiB,EAEpC,UAAU,EAAE,qBAAqB,EACjC,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,EAEpC,wBAAwB,CAAC,EAAE,wBAAwB,EAEnD,YAAY,CAAC,EAAE,gBAAgB,EAE/B,oBAAoB,CAAC,EAAE,oBAAoB,EAE3C,YAAY,CAAC,EAAE,mBAAmB,EAElC,aAAa,CAAC,EAAE,qBAAqB;IAoDvC;;;;;OAKG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjD;;;;;;;;;OASG;cACa,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgBxF;;;;;;;;;;OAUG;cACa,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,gBAAgB,CAAC;CAwJ7B"}
@@ -7,6 +7,19 @@ const core_1 = require("@nauth-toolkit/core");
7
7
  const internal_1 = require("@nauth-toolkit/core/internal");
8
8
  const facebook_oauth_client_1 = require("./facebook-oauth.client");
9
9
  const token_verifier_service_1 = require("./token-verifier.service");
10
+ /**
11
+ * Lightweight check for JWT format (header.payload.signature).
12
+ *
13
+ * Used to distinguish Facebook Limited Login ID tokens (JWT) from classic access tokens.
14
+ *
15
+ * @param token - Raw token string
16
+ * @returns True if token looks like a JWT
17
+ */
18
+ function isJwt(token) {
19
+ // JWTs are 3 base64url segments separated by dots.
20
+ const parts = token.split('.');
21
+ return parts.length === 3 && parts.every((p) => p.length > 0);
22
+ }
10
23
  /**
11
24
  * Facebook Social Authentication Service (Platform-Agnostic)
12
25
  *
@@ -130,27 +143,96 @@ class FacebookSocialAuthService extends internal_1.BaseSocialAuthProviderService
130
143
  * @returns User profile from verified token
131
144
  * @protected
132
145
  */
133
- async verifyNativeToken(idToken, _accessToken, profileData) {
146
+ async verifyNativeToken(idToken, accessToken, profileData) {
147
+ // TEMP_DEBUG_REMOVE: Log incoming tokens
148
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] verifyNativeToken called - idToken length: ${idToken?.length || 0}, accessToken length: ${accessToken?.length || 0}, idToken preview: ${idToken?.substring(0, 50)}...`);
134
149
  if (!this.tokenVerifier) {
150
+ // TEMP_DEBUG_REMOVE
151
+ this.logger?.error?.('[TEMP_DEBUG_REMOVE] Token verifier is null');
135
152
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_CONFIG_MISSING, 'Facebook OAuth is not enabled');
136
153
  }
137
154
  const providerConfig = this.getProviderConfig();
138
155
  if (!providerConfig) {
156
+ // TEMP_DEBUG_REMOVE
157
+ this.logger?.error?.('[TEMP_DEBUG_REMOVE] Provider config is null');
139
158
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_CONFIG_MISSING, 'Facebook OAuth is not configured');
140
159
  }
141
160
  const appId = Array.isArray(providerConfig.clientId) ? providerConfig.clientId[0] : providerConfig.clientId || '';
142
161
  const appSecret = providerConfig.clientSecret || '';
162
+ // TEMP_DEBUG_REMOVE
163
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Config loaded - appId: ${appId?.substring(0, 10)}..., appSecret present: ${!!appSecret}`);
143
164
  if (!this.tokenVerifier.verifyFacebookToken) {
165
+ // TEMP_DEBUG_REMOVE
166
+ this.logger?.error?.('[TEMP_DEBUG_REMOVE] verifyFacebookToken method not available');
144
167
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_CONFIG_MISSING, 'Facebook token verifier is not available');
145
168
  }
146
- // For Facebook, the idToken parameter actually contains the access token
147
- // Facebook native SDKs return access tokens, not ID tokens
148
- const accessToken = idToken;
149
- // Verify access token with Facebook's Graph API
150
- const verified = (await this.tokenVerifier.verifyFacebookToken(accessToken, appId, appSecret));
151
- this.logger?.debug?.(`Verified Facebook token for: ${verified.email || verified.id}`);
169
+ // ============================================================================
170
+ // Facebook Native Token Verification
171
+ // ============================================================================
172
+ // Facebook supports two native token shapes:
173
+ // - Classic login: access token (opaque string) -> verify via Graph API debug_token
174
+ // - Limited Login (iOS): ID token (JWT) -> verify via OIDC JWKS (RS256)
175
+ //
176
+ // NOTE: Base class passes dto.idToken as first arg; dto.accessToken as second arg.
177
+ // Consumers might send:
178
+ // - { accessToken } only (client SDK supports this) -> controller should map it into dto.idToken or dto.accessToken.
179
+ // - { idToken } (JWT) for Limited Login.
180
+ let verified;
181
+ const isJwtToken = isJwt(idToken);
182
+ const hasIdTokenVerifier = !!this.tokenVerifier.verifyFacebookIdToken;
183
+ // TEMP_DEBUG_REMOVE
184
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Token type detection - isJwt: ${isJwtToken}, hasIdTokenVerifier: ${hasIdTokenVerifier}`);
185
+ if (isJwtToken && hasIdTokenVerifier) {
186
+ // Limited Login: verify ID token (JWT) via Facebook OIDC JWKS.
187
+ // TEMP_DEBUG_REMOVE
188
+ this.logger?.debug?.('[TEMP_DEBUG_REMOVE] Attempting JWT verification path');
189
+ try {
190
+ if (!this.tokenVerifier.verifyFacebookIdToken) {
191
+ throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_CONFIG_MISSING, 'Facebook ID token verifier is not available');
192
+ }
193
+ const jwtProfile = (await this.tokenVerifier.verifyFacebookIdToken(idToken, appId));
194
+ // TEMP_DEBUG_REMOVE
195
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] JWT verification succeeded - sub: ${jwtProfile.sub}, email: ${jwtProfile.email || 'missing'}`);
196
+ verified = {
197
+ id: jwtProfile.sub,
198
+ email: jwtProfile.email,
199
+ first_name: jwtProfile.given_name || (jwtProfile.name ? jwtProfile.name.split(' ')[0] : undefined),
200
+ last_name: jwtProfile.family_name || undefined,
201
+ picture: jwtProfile.picture ? { data: { url: jwtProfile.picture } } : undefined,
202
+ };
203
+ this.logger?.debug?.(`Verified Facebook ID token for: ${verified.email || verified.id}`);
204
+ }
205
+ catch (jwtError) {
206
+ // TEMP_DEBUG_REMOVE
207
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] JWT verification failed: ${jwtError instanceof Error ? jwtError.message : String(jwtError)}`);
208
+ throw jwtError;
209
+ }
210
+ }
211
+ else {
212
+ // Classic login: verify access token via Graph API.
213
+ // Prefer explicit accessToken if provided, otherwise treat idToken as access token for backward compatibility.
214
+ const tokenToVerify = accessToken || idToken;
215
+ // TEMP_DEBUG_REMOVE
216
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Attempting access token verification path - token length: ${tokenToVerify.length}, token preview: ${tokenToVerify.substring(0, 50)}...`);
217
+ try {
218
+ const verifiedAccess = (await this.tokenVerifier.verifyFacebookToken(tokenToVerify, appId, appSecret));
219
+ verified = verifiedAccess;
220
+ // TEMP_DEBUG_REMOVE
221
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Access token verification succeeded - id: ${verified.id}, email: ${verified.email || 'missing'}`);
222
+ this.logger?.debug?.(`Verified Facebook access token for: ${verified.email || verified.id}`);
223
+ }
224
+ catch (accessError) {
225
+ // TEMP_DEBUG_REMOVE
226
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] Access token verification failed: ${accessError instanceof Error ? accessError.message : String(accessError)}`);
227
+ throw accessError;
228
+ }
229
+ }
152
230
  // CRITICAL: Require email from all social providers for signup
231
+ // TEMP_DEBUG_REMOVE
232
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Email validation check - verified.id: ${verified.id}, verified.email: ${verified.email || 'MISSING'}`);
153
233
  if (!verified.email) {
234
+ // TEMP_DEBUG_REMOVE
235
+ this.logger?.error?.('[TEMP_DEBUG_REMOVE] Email validation FAILED - email is missing from verified profile');
154
236
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_EMAIL_REQUIRED, 'Email is required from Facebook. Please grant email permissions.');
155
237
  }
156
238
  // Handle profile data from native SDK if available
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-social-auth.service.js","sourceRoot":"","sources":["../../src/facebook-social-auth.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"facebook-social-auth.service.js","sourceRoot":"","sources":["../../src/facebook-social-auth.service.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,8CAc6B;AAC7B,sDAAsD;AACtD,2DAQsC;AAEtC,mEAA8D;AAC9D,qEAAgG;AAGhG;;;;;;;GAOG;AACH,SAAS,KAAK,CAAC,KAAa;IAC1B,mDAAmD;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAa,yBAA0B,SAAQ,wCAA6B;IACjE,YAAY,GAAG,UAAU,CAAC;IAClB,WAAW,CAA6B;IACxC,aAAa,CAA+B;IAE7D,YACE,MAAmB,EACnB,MAAmB,EACnB,WAAwB,EACxB,iBAAoC,EACpC,UAAsB,EACtB,cAA8B,EAC9B,eAA2C,EAC3C,iBAAoC;IACpC,0CAA0C;IAC1C,UAAiC,EACjC,cAAoC;IACpC,yFAAyF;IACzF,wBAAmD;IACnD,2EAA2E;IAC3E,YAA+B;IAC/B,qFAAqF;IACrF,oBAA2C;IAC3C,+CAA+C;IAC/C,YAAkC;IAClC,mEAAmE;IACnE,aAAqC;QAErC,KAAK,CACH,MAAM,EACN,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,oBAAoB,EACpB,YAAY,CACb,CAAC;QAEF,mCAAmC;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,qCAAqC;QAC/C,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;QAClH,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;YACjD,6DAA6D;YAC7D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,2CAAmB,CAAC;YACzC,QAAQ,EAAE,WAAW;YACrB,YAAY,EAAE,cAAc,CAAC,YAAY;YACzC,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,EAAE;YAC7C,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;SAC7D,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,CAAC,aAAa;YAChB,aAAa;gBACb,IAAI,6CAA4B,CAAC,MAAM,CAAC;gBACvC,IAAI,CAAC,MAAoD,CAAC,aAAa;gBACxE,IAAI,CAAC;QAEP,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,KAAc;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;;;OASG;IACO,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,MAAc;QAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YACnD,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,+CAA+C,CAAC,CAAC;QACjH,CAAC;QAED,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;QAE7F,iCAAiC;QACjC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;;;OAUG;IACO,KAAK,CAAC,iBAAiB,CAC/B,OAAe,EACf,WAAoB,EACpB,WAAqB;QAErB,yCAAyC;QACzC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,kEAAkE,OAAO,EAAE,MAAM,IAAI,CAAC,yBAAyB,WAAW,EAAE,MAAM,IAAI,CAAC,sBAAsB,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAC5L,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,4CAA4C,CAAC,CAAC;YACnE,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,6CAA6C,CAAC,CAAC;YACpE,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,kCAAkC,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,IAAI,EAAE,CAAC;QAClH,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,IAAI,EAAE,CAAC;QAEpD,oBAAoB;QACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,8CAA8C,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,SAAS,EAAE,CAC9G,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;YAC5C,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,8DAA8D,CAAC,CAAC;YACrF,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;QAC5G,CAAC;QAED,+EAA+E;QAC/E,qCAAqC;QACrC,+EAA+E;QAC/E,6CAA6C;QAC7C,oFAAoF;QACpF,wEAAwE;QACxE,EAAE;QACF,mFAAmF;QACnF,wBAAwB;QACxB,qHAAqH;QACrH,yCAAyC;QACzC,IAAI,QAAsC,CAAC;QAE3C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;QACtE,oBAAoB;QACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,qDAAqD,UAAU,yBAAyB,kBAAkB,EAAE,CAC7G,CAAC;QAEF,IAAI,UAAU,IAAI,kBAAkB,EAAE,CAAC;YACrC,+DAA+D;YAC/D,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,sDAAsD,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;oBAC9C,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,qBAAqB,EAAE,6CAA6C,CAAC,CAAC;gBAC/G,CAAC;gBACD,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAOjF,CAAC;gBAEF,oBAAoB;gBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,yDAAyD,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC,KAAK,IAAI,SAAS,EAAE,CACnH,CAAC;gBAEF,QAAQ,GAAG;oBACT,EAAE,EAAE,UAAU,CAAC,GAAG;oBAClB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAClG,SAAS,EAAE,UAAU,CAAC,WAAW,IAAI,SAAS;oBAC9C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChF,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,mCAAmC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,oBAAoB;gBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,gDAAgD,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAClH,CAAC;gBACF,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,+GAA+G;YAC/G,MAAM,aAAa,GAAG,WAAW,IAAI,OAAO,CAAC;YAE7C,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,iFAAiF,aAAa,CAAC,MAAM,oBAAoB,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAC7J,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAClE,aAAa,EACb,KAAK,EACL,SAAS,CACV,CAAiC,CAAC;gBACnC,QAAQ,GAAG,cAAc,CAAC;gBAC1B,oBAAoB;gBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,iEAAiE,QAAQ,CAAC,EAAE,YAAY,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,CACtH,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,uCAAuC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/F,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,oBAAoB;gBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,yDAAyD,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CACpI,CAAC;gBACF,MAAM,WAAW,CAAC;YACpB,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,oBAAoB;QACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAClB,6DAA6D,QAAQ,CAAC,EAAE,qBAAqB,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,CAC3H,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,oBAAoB;YACpB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,sFAAsF,CAAC,CAAC;YAC7G,MAAM,IAAI,qBAAc,CACtB,oBAAa,CAAC,qBAAqB,EACnC,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,MAAM,gBAAgB,GAAG,WAAsF,CAAC;QAChH,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC3B,SAAS,EAAE,QAAQ,CAAC,UAAU,IAAI,gBAAgB,EAAE,SAAS,IAAI,IAAI;YACrE,QAAQ,EAAE,QAAQ,CAAC,SAAS,IAAI,gBAAgB,EAAE,QAAQ,IAAI,IAAI;YAClE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,gBAAgB,EAAE,OAAO,IAAI,IAAI;YACzE,QAAQ,EAAE,IAAI,EAAE,4CAA4C;YAC5D,GAAG,EAAE;gBACH,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;aACY;SACxC,CAAC;IACJ,CAAC;CACF;AA7RD,8DA6RC"}
@@ -1,13 +1,22 @@
1
1
  import { NAuthConfig, ITokenVerifierService } from '@nauth-toolkit/core';
2
2
  import { VerifiedFacebookTokenProfile } from './verified-token-profile.interface';
3
+ /**
4
+ * jose module type (ESM-only dependency).
5
+ *
6
+ * IMPORTANT: `jose@6` is ESM-only. This package is compiled to CommonJS by default,
7
+ * so we load jose via dynamic import to avoid `ERR_REQUIRE_ESM` at runtime.
8
+ */
9
+ type JoseModule = typeof import('jose');
3
10
  /**
4
11
  * Token Verifier Service for Facebook OAuth (Platform-Agnostic)
5
12
  *
6
13
  * Handles secure verification of Facebook access tokens via Graph API.
14
+ * Also supports verifying Facebook OIDC ID tokens (Limited Login) via JWKS.
7
15
  * Validates tokens by calling Facebook's debug_token endpoint.
8
16
  *
9
17
  * Security Features:
10
18
  * - Facebook: Validates access tokens via Facebook Graph API
19
+ * - Facebook (Limited Login): Validates ID tokens via OIDC JWKS (RS256)
11
20
  *
12
21
  * This is a plain TypeScript class with no framework dependencies.
13
22
  *
@@ -20,7 +29,12 @@ import { VerifiedFacebookTokenProfile } from './verified-token-profile.interface
20
29
  */
21
30
  export declare class TokenVerifierService implements ITokenVerifierService {
22
31
  private readonly logger;
23
- constructor(config: NAuthConfig);
32
+ private facebookJWKS;
33
+ private readonly loadJose;
34
+ private joseModulePromise;
35
+ constructor(config: NAuthConfig, loadJose?: () => Promise<JoseModule>);
36
+ private getJose;
37
+ private getFacebookJWKS;
24
38
  /**
25
39
  * Verify Facebook access token via Graph API
26
40
  *
@@ -44,5 +58,33 @@ export declare class TokenVerifierService implements ITokenVerifierService {
44
58
  * ```
45
59
  */
46
60
  verifyFacebookToken(accessToken: string, appId: string, appSecret: string): Promise<VerifiedFacebookTokenProfile>;
61
+ /**
62
+ * Verify Facebook ID token (OIDC / Limited Login) with JWT signature validation
63
+ *
64
+ * Facebook Limited Login (primarily iOS) returns an ID token (JWT) that must be
65
+ * verified using Facebook's OIDC JWKS (RS256).
66
+ *
67
+ * ⚠️ WARNING: If the client uses `nonce`, the backend cannot validate it unless the
68
+ * client also sends the original nonce. This method still provides strong security by
69
+ * validating signature, issuer, audience, and expiry.
70
+ *
71
+ * @param idToken - Facebook ID token (JWT)
72
+ * @param appId - Facebook App ID for audience validation
73
+ * @returns Minimal verified profile payload (provider-specific)
74
+ * @throws {NAuthException} SOCIAL_TOKEN_INVALID when token is invalid
75
+ */
76
+ verifyFacebookIdToken(idToken: string, appId: string): Promise<{
77
+ sub: string;
78
+ email?: string;
79
+ name?: string;
80
+ given_name?: string;
81
+ family_name?: string;
82
+ picture?: string;
83
+ }>;
84
+ /**
85
+ * Clear cached clients and keys
86
+ */
87
+ clearCache(): void;
47
88
  }
89
+ export {};
48
90
  //# sourceMappingURL=token-verifier.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-verifier.service.d.ts","sourceRoot":"","sources":["../../src/token-verifier.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8C,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAwBlF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,WAAW;IAI/B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,4BAA4B,CAAC;CA8DzC"}
1
+ {"version":3,"file":"token-verifier.service.d.ts","sourceRoot":"","sources":["../../src/token-verifier.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAA8C,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAElF;;;;;GAKG;AACH,KAAK,UAAU,GAAG,cAAc,MAAM,CAAC,CAAC;AAwBxC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,YAAY,CAA6D;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,iBAAiB,CAAoC;gBAEjD,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;YAKvD,OAAO;YAOP,eAAe;IAS7B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,4BAA4B,CAAC;IAqHxC;;;;;;;;;;;;;;OAcG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAoEF;;OAEG;IACH,UAAU,IAAI,IAAI;CAInB"}
@@ -1,4 +1,37 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.TokenVerifierService = void 0;
4
37
  const core_1 = require("@nauth-toolkit/core");
@@ -6,10 +39,12 @@ const core_1 = require("@nauth-toolkit/core");
6
39
  * Token Verifier Service for Facebook OAuth (Platform-Agnostic)
7
40
  *
8
41
  * Handles secure verification of Facebook access tokens via Graph API.
42
+ * Also supports verifying Facebook OIDC ID tokens (Limited Login) via JWKS.
9
43
  * Validates tokens by calling Facebook's debug_token endpoint.
10
44
  *
11
45
  * Security Features:
12
46
  * - Facebook: Validates access tokens via Facebook Graph API
47
+ * - Facebook (Limited Login): Validates ID tokens via OIDC JWKS (RS256)
13
48
  *
14
49
  * This is a plain TypeScript class with no framework dependencies.
15
50
  *
@@ -22,8 +57,27 @@ const core_1 = require("@nauth-toolkit/core");
22
57
  */
23
58
  class TokenVerifierService {
24
59
  logger;
25
- constructor(config) {
60
+ facebookJWKS = null;
61
+ loadJose;
62
+ joseModulePromise = null;
63
+ constructor(config, loadJose) {
26
64
  this.logger = config.logger;
65
+ this.loadJose = loadJose ?? (() => Promise.resolve().then(() => __importStar(require('jose'))));
66
+ }
67
+ async getJose() {
68
+ if (!this.joseModulePromise) {
69
+ this.joseModulePromise = this.loadJose();
70
+ }
71
+ return await this.joseModulePromise;
72
+ }
73
+ async getFacebookJWKS() {
74
+ if (this.facebookJWKS)
75
+ return this.facebookJWKS;
76
+ const jose = await this.getJose();
77
+ // Facebook OIDC JWKS (used by Limited Login / ID tokens).
78
+ // Source of truth: https://www.facebook.com/.well-known/openid-configuration
79
+ this.facebookJWKS = jose.createRemoteJWKSet(new URL('https://www.facebook.com/.well-known/oauth/openid/jwks/'));
80
+ return this.facebookJWKS;
27
81
  }
28
82
  /**
29
83
  * Verify Facebook access token via Graph API
@@ -49,29 +103,55 @@ class TokenVerifierService {
49
103
  */
50
104
  async verifyFacebookToken(accessToken, appId, appSecret) {
51
105
  try {
106
+ // TEMP_DEBUG_REMOVE
107
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] verifyFacebookToken called - token length: ${accessToken.length}, appId: ${appId?.substring(0, 10)}..., appSecret present: ${!!appSecret}`);
52
108
  this.logger?.debug?.('[TokenVerifier] Verifying Facebook token with Graph API');
53
109
  // Step 1: Verify token with debug_token endpoint
54
110
  const debugUrl = `https://graph.facebook.com/debug_token?input_token=${accessToken}&access_token=${appId}|${appSecret}`;
111
+ // TEMP_DEBUG_REMOVE
112
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Calling debug_token endpoint: ${debugUrl.replace(accessToken, 'TOKEN_REDACTED')}`);
55
113
  const debugResponse = await fetch(debugUrl);
114
+ // TEMP_DEBUG_REMOVE
115
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] debug_token response status: ${debugResponse.status} ${debugResponse.statusText}`);
56
116
  if (!debugResponse.ok) {
117
+ // TEMP_DEBUG_REMOVE
118
+ const errorText = await debugResponse.text().catch(() => 'Unable to read error response');
119
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] debug_token HTTP error - status: ${debugResponse.status}, body: ${errorText.substring(0, 200)}`);
57
120
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Facebook token validation failed');
58
121
  }
59
122
  const debugData = (await debugResponse.json());
123
+ // TEMP_DEBUG_REMOVE
124
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] debug_token response data: ${JSON.stringify(debugData).substring(0, 300)}`);
60
125
  // Check if token is valid
61
126
  if (!debugData.data || !debugData.data.is_valid) {
127
+ // TEMP_DEBUG_REMOVE
128
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] Token validation failed - is_valid: ${debugData.data?.is_valid}, data present: ${!!debugData.data}`);
62
129
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Invalid Facebook access token');
63
130
  }
64
131
  // Check if token belongs to the correct app
132
+ // TEMP_DEBUG_REMOVE
133
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] App ID check - token app_id: ${debugData.data.app_id}, expected appId: ${appId}`);
65
134
  if (debugData.data.app_id !== appId) {
135
+ // TEMP_DEBUG_REMOVE
136
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] App ID mismatch - token belongs to app: ${debugData.data.app_id}, expected: ${appId}`);
66
137
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Token does not belong to this app');
67
138
  }
68
139
  // Step 2: Get user profile
69
140
  const profileUrl = `https://graph.facebook.com/me?fields=id,email,first_name,last_name,picture&access_token=${accessToken}`;
141
+ // TEMP_DEBUG_REMOVE
142
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Calling /me endpoint: ${profileUrl.replace(accessToken, 'TOKEN_REDACTED')}`);
70
143
  const profileResponse = await fetch(profileUrl);
144
+ // TEMP_DEBUG_REMOVE
145
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] /me response status: ${profileResponse.status} ${profileResponse.statusText}`);
71
146
  if (!profileResponse.ok) {
147
+ // TEMP_DEBUG_REMOVE
148
+ const errorText = await profileResponse.text().catch(() => 'Unable to read error response');
149
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] /me HTTP error - status: ${profileResponse.status}, body: ${errorText.substring(0, 200)}`);
72
150
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Failed to fetch Facebook user profile');
73
151
  }
74
152
  const profile = (await profileResponse.json());
153
+ // TEMP_DEBUG_REMOVE
154
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] /me response data: ${JSON.stringify(profile).substring(0, 300)}`);
75
155
  this.logger?.log?.(`[TokenVerifier] Facebook token verified (secure): ${profile.email || profile.id}`);
76
156
  // Handle picture field - it can be a string or an object with data.url
77
157
  let picture;
@@ -93,10 +173,76 @@ class TokenVerifierService {
93
173
  }
94
174
  catch (error) {
95
175
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
176
+ // TEMP_DEBUG_REMOVE
177
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] verifyFacebookToken catch block - error type: ${error?.constructor?.name}, message: ${errorMessage}, stack: ${error instanceof Error ? error.stack?.substring(0, 500) : 'N/A'}`);
96
178
  this.logger?.error?.(`[TokenVerifier] Facebook token verification FAILED: ${errorMessage}`);
97
179
  throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, `Facebook token verification failed: ${errorMessage}`);
98
180
  }
99
181
  }
182
+ /**
183
+ * Verify Facebook ID token (OIDC / Limited Login) with JWT signature validation
184
+ *
185
+ * Facebook Limited Login (primarily iOS) returns an ID token (JWT) that must be
186
+ * verified using Facebook's OIDC JWKS (RS256).
187
+ *
188
+ * ⚠️ WARNING: If the client uses `nonce`, the backend cannot validate it unless the
189
+ * client also sends the original nonce. This method still provides strong security by
190
+ * validating signature, issuer, audience, and expiry.
191
+ *
192
+ * @param idToken - Facebook ID token (JWT)
193
+ * @param appId - Facebook App ID for audience validation
194
+ * @returns Minimal verified profile payload (provider-specific)
195
+ * @throws {NAuthException} SOCIAL_TOKEN_INVALID when token is invalid
196
+ */
197
+ async verifyFacebookIdToken(idToken, appId) {
198
+ try {
199
+ // TEMP_DEBUG_REMOVE
200
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] verifyFacebookIdToken called - token length: ${idToken.length}, appId: ${appId?.substring(0, 10)}..., token preview: ${idToken.substring(0, 50)}...`);
201
+ const jose = await this.getJose();
202
+ const jwks = await this.getFacebookJWKS();
203
+ this.logger?.debug?.('[TokenVerifier] Verifying Facebook ID token (OIDC / Limited Login)');
204
+ // TEMP_DEBUG_REMOVE
205
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Calling jwtVerify with issuer: https://www.facebook.com, audience: ${appId}`);
206
+ const { payload } = await jose.jwtVerify(idToken, jwks, {
207
+ issuer: 'https://www.facebook.com',
208
+ audience: appId,
209
+ clockTolerance: 300, // 5 minutes leeway
210
+ });
211
+ // TEMP_DEBUG_REMOVE
212
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] jwtVerify succeeded - payload keys: ${Object.keys(payload).join(', ')}`);
213
+ const p = payload;
214
+ // TEMP_DEBUG_REMOVE
215
+ this.logger?.debug?.(`[TEMP_DEBUG_REMOVE] Payload extraction - sub: ${p.sub || 'MISSING'}, email: ${p.email || 'MISSING'}, name: ${p.name || 'MISSING'}`);
216
+ if (!p.sub) {
217
+ // TEMP_DEBUG_REMOVE
218
+ this.logger?.error?.('[TEMP_DEBUG_REMOVE] Missing sub claim in JWT payload');
219
+ throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Missing required fields in Facebook token (sub)');
220
+ }
221
+ this.logger?.log?.(`[TokenVerifier] Facebook ID token verified (secure): ${p.email || p.sub}`);
222
+ return {
223
+ sub: p.sub,
224
+ email: p.email,
225
+ name: p.name,
226
+ given_name: p.given_name,
227
+ family_name: p.family_name,
228
+ picture: p.picture,
229
+ };
230
+ }
231
+ catch (error) {
232
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
233
+ // TEMP_DEBUG_REMOVE
234
+ this.logger?.error?.(`[TEMP_DEBUG_REMOVE] verifyFacebookIdToken catch block - error type: ${error?.constructor?.name}, message: ${errorMessage}, stack: ${error instanceof Error ? error.stack?.substring(0, 500) : 'N/A'}`);
235
+ this.logger?.error?.(`[TokenVerifier] Facebook ID token verification FAILED: ${errorMessage}`);
236
+ throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, `Facebook ID token verification failed: ${errorMessage}`);
237
+ }
238
+ }
239
+ /**
240
+ * Clear cached clients and keys
241
+ */
242
+ clearCache() {
243
+ this.facebookJWKS = null;
244
+ this.joseModulePromise = null;
245
+ }
100
246
  }
101
247
  exports.TokenVerifierService = TokenVerifierService;
102
248
  //# sourceMappingURL=token-verifier.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-verifier.service.js","sourceRoot":"","sources":["../../src/token-verifier.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-verifier.service.js","sourceRoot":"","sources":["../../src/token-verifier.service.ts"],"names":[],"mappings":"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"}