| author | |
| committer | |
| log | 285cf5947b14acb9a66d26a669ce632633fd0749 |
| tree | d2d03a9ac1522366d18db1c6b9f40589690990dd |
| parent | 1a003e383ac6b10258b8100c2617d938c4f06c69 |
| signature | Signed by PGP key B5690EEEBB952194 |
2 files changed, 27 insertions(+), 9 deletions(-)
apps/web/src/components/clerk/authRedirect.test.ts+15-4| ... | @@ -8,11 +8,22 @@ describe("resolveClerkSignInProps", () => { | ... | @@ -8,11 +8,22 @@ describe("resolveClerkSignInProps", () => { |
| 8 | expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href }); | 8 | expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href }); |
| 9 | }); | 9 | }); |
| 10 | 10 | ||
| 11 | it("omits the redirect override on packaged desktop", () => { | 11 | it("removes a Clerk virtual pathname and callback params while preserving the desktop route", () => { |
| 12 | expect(resolveClerkSignInProps("t3code://app/#/settings/general", true)).toEqual({}); | 12 | expect( |
| 13 | resolveClerkSignInProps( | ||
| 14 | "t3code://app/CLERK-ROUTER/VIRTUAL/sign-up?__clerk_status=complete#/settings/connections", | ||
| 15 | true, | ||
| 16 | ), | ||
| 17 | ).toEqual({ | ||
| 18 | forceRedirectUrl: "t3code://app/#/settings/connections", | ||
| 19 | signUpForceRedirectUrl: "t3code://app/#/settings/connections", | ||
| 20 | }); | ||
| 13 | }); | 21 | }); |
| 14 | 22 | ||
| 15 | it("omits the redirect override on development desktop", () => { | 23 | it("preserves a clean development desktop route", () => { |
| 16 | expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({}); | 24 | expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({ |
| 25 | forceRedirectUrl: "t3code-dev://app/#/settings/general", | ||
| 26 | signUpForceRedirectUrl: "t3code-dev://app/#/settings/general", | ||
| 27 | }); | ||
| 17 | }); | 28 | }); |
| 18 | }); | 29 | }); |
apps/web/src/components/clerk/authRedirect.ts+12-5| ... | @@ -1,12 +1,19 @@ | ... | @@ -1,12 +1,19 @@ |
| 1 | export interface ClerkSignInProps { | 1 | export interface ClerkSignInProps { |
| 2 | forceRedirectUrl?: string; | 2 | forceRedirectUrl?: string; |
| 3 | signUpForceRedirectUrl?: string; | ||
| 3 | } | 4 | } |
| 4 | 5 | ||
| 5 | // Clerk's native-app allowlist only authorizes the bare renderer root | ||
| 6 | // (t3code://app/), which @clerk/electron's OAuth transport already supplies, | ||
| 7 | // so any page-derived redirect override gets the whole sign-in request | ||
| 8 | // rejected. On Electron, omit the override and let Clerk use its defaults. | ||
| 9 | export function resolveClerkSignInProps(href: string, isElectron: boolean): ClerkSignInProps { | 6 | export function resolveClerkSignInProps(href: string, isElectron: boolean): ClerkSignInProps { |
| 10 | if (isElectron) return {}; | 7 | if (isElectron) { |
| 8 | // Electron routes through the hash, so reset any Clerk virtual pathname without losing the T3 page. | ||
| 9 | const redirectUrl = new URL(href); | ||
| 10 | redirectUrl.pathname = "/"; | ||
| 11 | redirectUrl.search = ""; | ||
| 12 | |||
| 13 | return { | ||
| 14 | forceRedirectUrl: redirectUrl.toString(), | ||
| 15 | signUpForceRedirectUrl: redirectUrl.toString(), | ||
| 16 | }; | ||
| 17 | } | ||
| 11 | return { forceRedirectUrl: href }; | 18 | return { forceRedirectUrl: href }; |
| 12 | } | 19 | } |