diff --git a/.changeset/silly-coins-consent.md b/.changeset/silly-coins-consent.md new file mode 100644 index 00000000000..c232e227340 --- /dev/null +++ b/.changeset/silly-coins-consent.md @@ -0,0 +1,7 @@ +--- +'@clerk/localizations': patch +'@clerk/shared': patch +'@clerk/ui': patch +--- + +Make OAuth consent screens clearly identify private metadata as potentially sensitive information set by the Clerk application. diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 9b70f8d0a2d..8420ef26b84 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -853,6 +853,7 @@ export const arSA: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index 3fb72ae5d54..93604b18488 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -855,6 +855,7 @@ export const beBY: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 4e14def42ab..9c37f2f9832 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -854,6 +854,7 @@ export const bgBG: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index d8a33bdfa92..eee4b256d66 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -860,6 +860,7 @@ export const bnIN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index fe24667d6a5..912c5a72925 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -860,6 +860,7 @@ export const caES: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 40ca97e4f47..bb907f902fa 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -858,6 +858,7 @@ export const csCZ: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 8f6cd90e1ce..8c93b674edf 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -853,6 +853,7 @@ export const daDK: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index f7c181cf898..b90b25b3ca2 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -864,6 +864,7 @@ export const deDE: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index fbc71c2473a..bff8a6a78b6 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -856,6 +856,7 @@ export const elGR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index 74fa7ea9e73..79ac6c67bbb 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -853,6 +853,7 @@ export const enGB: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index d766d4ce383..efc7eff6995 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -875,6 +875,7 @@ export const enUS: LocalizationResource = { title: 'Redirect URL', }, scopeList: { + privateMetadata: 'Your private metadata set by {{applicationName}}, which may include sensitive information', title: 'This will allow {{applicationName}} access to:', }, subtitle: 'wants to access {{applicationName}} on behalf of {{identifier}}', diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 6c465f680a0..36a0a04d0ec 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -855,6 +855,7 @@ export const esCR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index 2d6895e5822..bfd8d24ef84 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -860,6 +860,7 @@ export const esES: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 64b90aa3da2..aea265ad4c7 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -856,6 +856,7 @@ export const esMX: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index b027e07069f..c62eb1762fa 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -855,6 +855,7 @@ export const esUY: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 1cf0c875abf..22827362f99 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -859,6 +859,7 @@ export const faIR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index d02b810a53a..5bfe223229b 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -860,6 +860,7 @@ export const fiFI: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 3ef7465f900..c472f336904 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -864,6 +864,7 @@ export const frFR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index b1763ec3337..2a3ba9a956a 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -852,6 +852,7 @@ export const heIL: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 98812de0410..3acfd4db4a5 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -860,6 +860,7 @@ export const hiIN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index db93f008960..990b1258b76 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -860,6 +860,7 @@ export const hrHR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 3a3aff4cfe8..dd9f1e78a69 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -861,6 +861,7 @@ export const huHU: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index df03c826a49..ea52c8fd6fa 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -854,6 +854,7 @@ export const idID: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index a2f5087a28e..c06f20b105c 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -860,6 +860,7 @@ export const isIS: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 305b7cc39d0..c714cd721db 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -861,6 +861,7 @@ export const itIT: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index ad9f53c787f..3ab6862adfb 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -860,6 +860,7 @@ export const jaJP: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index f2ecf7e21fe..d5771bf7f95 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -853,6 +853,7 @@ export const kkKZ: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 0bb35f7cee4..5ceb74b18cc 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -856,6 +856,7 @@ export const koKR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 0d25f3cea12..2bb88ab2fb8 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -854,6 +854,7 @@ export const mnMN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 72e32d5764c..86d2d84b14b 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -862,6 +862,7 @@ export const msMY: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index edd764c32d5..d614810caef 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -862,6 +862,7 @@ export const nbNO: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index 4107509c7d1..efcac54de9a 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -853,6 +853,7 @@ export const nlBE: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index b54ddc59780..29ed1a0b899 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -853,6 +853,7 @@ export const nlNL: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 92adfd113a1..b84cfe863ee 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -854,6 +854,7 @@ export const plPL: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 0b9478c97dd..9e3bf101f8a 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -861,6 +861,7 @@ export const ptBR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index f378392dcb4..da2b7bf79af 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -862,6 +862,7 @@ export const ptPT: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 6a91ac6bbd0..d0439eef007 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -861,6 +861,7 @@ export const roRO: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 545061ad0e5..bfcd33d3f1c 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -857,6 +857,7 @@ export const ruRU: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 0c34697e47f..468818450a8 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -854,6 +854,7 @@ export const skSK: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index 92aee810ba2..be68fa18bca 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -853,6 +853,7 @@ export const srRS: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index 56d3da38257..d36e466183a 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -854,6 +854,7 @@ export const svSE: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index 587a71d59e5..bd3d1553de1 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -862,6 +862,7 @@ export const taIN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index de16deaba50..84268a6852a 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -860,6 +860,7 @@ export const teIN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 8c8b34e16ba..7bfc646066f 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -856,6 +856,7 @@ export const thTH: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 98e08e93e4a..819d6fc9986 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -853,6 +853,7 @@ export const trTR: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index dc6f645e1c5..54573559b55 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -854,6 +854,7 @@ export const ukUA: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 4d61f937845..d891df354ef 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -860,6 +860,7 @@ export const viVN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 50fd9254b16..f8c7e8e821e 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -851,6 +851,7 @@ export const zhCN: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index b79689fb355..7f04ea9edc4 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -854,6 +854,7 @@ export const zhTW: LocalizationResource = { title: undefined, }, scopeList: { + privateMetadata: undefined, title: undefined, }, subtitle: undefined, diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 19074bdbae5..2a4a8d2d83d 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1341,6 +1341,7 @@ export type __internal_LocalizationResource = { oauthConsent: { subtitle: LocalizationValue<'applicationName' | 'identifier'>; scopeList: { + privateMetadata: LocalizationValue<'applicationName'>; title: LocalizationValue<'applicationName'>; }; action__deny: LocalizationValue; diff --git a/packages/ui/src/components/OAuthConsent/OAuthConsent.tsx b/packages/ui/src/components/OAuthConsent/OAuthConsent.tsx index dd403253117..e85b0229dce 100644 --- a/packages/ui/src/components/OAuthConsent/OAuthConsent.tsx +++ b/packages/ui/src/components/OAuthConsent/OAuthConsent.tsx @@ -27,6 +27,7 @@ import { OrgSelect } from './OrgSelect'; import { getForwardedParams, getOAuthConsentFromSearch, getRedirectDisplay, getRedirectUriFromSearch } from './utils'; const OFFLINE_ACCESS_SCOPE = 'offline_access'; +const PRIVATE_METADATA_SCOPE = 'private_metadata'; const USER_ORG_READ_SCOPE = 'user:org:read'; function _OAuthConsent() { @@ -148,7 +149,15 @@ function _OAuthConsent() { const primaryIdentifier = user?.primaryEmailAddress?.emailAddress || user?.primaryPhoneNumber?.phoneNumber; - const displayedScopes = scopes.filter(item => item.scope !== OFFLINE_ACCESS_SCOPE); + const displayedScopes = scopes + .filter(item => item.scope !== OFFLINE_ACCESS_SCOPE) + .map(item => ({ + ...item, + description: + item.scope === PRIVATE_METADATA_SCOPE + ? t(localizationKeys('oauthConsent.scopeList.privateMetadata', { applicationName })) + : item.description, + })); const hasOfflineAccess = scopes.some(item => item.scope === OFFLINE_ACCESS_SCOPE); return ( diff --git a/packages/ui/src/components/OAuthConsent/__tests__/OAuthConsent.test.tsx b/packages/ui/src/components/OAuthConsent/__tests__/OAuthConsent.test.tsx index fc401643835..1b02ec27a2b 100644 --- a/packages/ui/src/components/OAuthConsent/__tests__/OAuthConsent.test.tsx +++ b/packages/ui/src/components/OAuthConsent/__tests__/OAuthConsent.test.tsx @@ -3,6 +3,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { bindCreateFixtures } from '@/test/create-fixtures'; import { render, waitFor } from '@/test/utils'; +import { OptionsProvider } from '../../../contexts'; import { OAuthConsent } from '../OAuthConsent'; const { createFixtures } = bindCreateFixtures('OAuthConsent'); @@ -28,6 +29,14 @@ const fakeConsentInfoWithOrgScope = { ], }; +const fakeConsentInfoWithPrivateMetadataScope = { + ...fakeConsentInfo, + scopes: [ + ...fakeConsentInfo.scopes, + { scope: 'private_metadata', description: 'Your private metadata', requiresConsent: true }, + ], +}; + /** * `oauthApplication` is a getter on the Clerk prototype and cannot be assigned * directly. Use Object.defineProperty to replace it with a configurable mock. @@ -99,6 +108,63 @@ describe('OAuthConsent', () => { }); }); + it('identifies private metadata as potentially sensitive data set by the Clerk application', async () => { + const { wrapper, fixtures, props } = await createFixtures(f => { + f.withUser({ email_addresses: ['jane@example.com'] }); + }); + + props.setProps({ componentName: 'OAuthConsent' } as any); + mockOAuthApplication(fixtures.clerk, { + getConsentInfo: vi.fn().mockResolvedValue(fakeConsentInfoWithPrivateMetadataScope), + }); + + const { getByText, queryByText } = render(, { wrapper }); + + await waitFor(() => { + expect(getByText('Your private metadata set by TestApp, which may include sensitive information')).toBeVisible(); + }); + expect(queryByText('Your private metadata')).toBeNull(); + }); + + it('supports localizing the private metadata scope description', async () => { + const { + wrapper: Wrapper, + fixtures, + props, + } = await createFixtures(f => { + f.withUser({ email_addresses: ['jane@example.com'] }); + }); + + props.setProps({ componentName: 'OAuthConsent' } as any); + mockOAuthApplication(fixtures.clerk, { + getConsentInfo: vi.fn().mockResolvedValue(fakeConsentInfoWithPrivateMetadataScope), + }); + + const wrapper = ({ children }) => ( + + + {children} + + + ); + + const { getByText } = render(, { wrapper }); + + await waitFor(() => { + expect(getByText('Localized private metadata from TestApp')).toBeVisible(); + }); + }); + it('renders a single form with allow/deny submit buttons in the public flow', async () => { const { wrapper, fixtures, props } = await createFixtures(f => { f.withUser({ email_addresses: ['jane@example.com'] });