|
1 | 1 | const Parse = require('parse/node'); |
2 | | -import { isDeepStrictEqual } from 'util'; |
3 | 2 | import { getRequestObject, resolveError } from './triggers'; |
4 | 3 | import { logger } from './logger'; |
5 | 4 | import { LRUCache as LRU } from 'lru-cache'; |
@@ -456,9 +455,29 @@ const hasMutatedAuthData = (authData, userAuthData) => { |
456 | 455 | if (provider === 'anonymous') { return; } |
457 | 456 | const providerData = authData[provider]; |
458 | 457 | const userProviderAuthData = userAuthData[provider]; |
459 | | - if (!isDeepStrictEqual(providerData, userProviderAuthData)) { |
| 458 | + |
| 459 | + // If unlinking (setting to null), consider it mutated |
| 460 | + if (providerData === null) { |
| 461 | + mutatedAuthData[provider] = providerData; |
| 462 | + return; |
| 463 | + } |
| 464 | + |
| 465 | + // If provider doesn't exist in stored data, it's new |
| 466 | + if (!userProviderAuthData) { |
460 | 467 | mutatedAuthData[provider] = providerData; |
| 468 | + return; |
461 | 469 | } |
| 470 | + |
| 471 | + // If provider exists, check if the id has changed |
| 472 | + // Only consider it mutated if the id is different |
| 473 | + // This prevents re-validation when auth adapters strip fields via afterFind |
| 474 | + if (providerData?.id !== userProviderAuthData?.id) { |
| 475 | + mutatedAuthData[provider] = providerData; |
| 476 | + return; |
| 477 | + } |
| 478 | + |
| 479 | + // If id is the same, don't treat as mutation even if other fields differ |
| 480 | + // This handles the case where afterFind strips sensitive fields like 'code' |
462 | 481 | }); |
463 | 482 | const hasMutatedAuthData = Object.keys(mutatedAuthData).length !== 0; |
464 | 483 | return { hasMutatedAuthData, mutatedAuthData }; |
|
0 commit comments