diff --git a/apps/dashboard/app/auth/sign-in/oauth-signin.tsx b/apps/dashboard/app/auth/sign-in/oauth-signin.tsx index f05574538a..a0f5df9fef 100644 --- a/apps/dashboard/app/auth/sign-in/oauth-signin.tsx +++ b/apps/dashboard/app/auth/sign-in/oauth-signin.tsx @@ -26,7 +26,6 @@ export const OAuthSignIn: React.FC = () => { try { setIsLoading(provider); setLastUsed(provider); - const url = await signInViaOAuth({ provider, redirectUrlComplete, diff --git a/apps/dashboard/app/auth/sso-callback/[[...sso-callback]]/route.ts b/apps/dashboard/app/auth/sso-callback/[[...sso-callback]]/route.ts index 4f510e1339..757bfd80db 100644 --- a/apps/dashboard/app/auth/sso-callback/[[...sso-callback]]/route.ts +++ b/apps/dashboard/app/auth/sso-callback/[[...sso-callback]]/route.ts @@ -1,6 +1,7 @@ import { setCookiesOnResponse } from "@/lib/auth/cookies"; import { auth } from "@/lib/auth/server"; import { AuthErrorCode, SIGN_IN_URL } from "@/lib/auth/types"; +import { getBaseUrl } from "@/lib/utils"; import { type NextRequest, NextResponse } from "next/server"; export async function GET(request: NextRequest) { const authResult = await auth.completeOAuthSignIn(request); @@ -34,7 +35,7 @@ export async function GET(request: NextRequest) { } // Get base URL from request because Next.js wants it - const baseUrl = new URL(request.url).origin; + const baseUrl = getBaseUrl(); const response = NextResponse.redirect(new URL(authResult.redirectTo, baseUrl)); return await setCookiesOnResponse(response, authResult.cookies); diff --git a/apps/dashboard/lib/auth/types.ts b/apps/dashboard/lib/auth/types.ts index f4a2379e4d..687fc1793a 100644 --- a/apps/dashboard/lib/auth/types.ts +++ b/apps/dashboard/lib/auth/types.ts @@ -118,7 +118,6 @@ export interface SessionData { export type OAuthStrategy = "google" | "github"; export interface SignInViaOAuthOptions { - redirectUrl?: string; redirectUrlComplete: string; provider: OAuthStrategy; } diff --git a/apps/dashboard/lib/auth/workos.ts b/apps/dashboard/lib/auth/workos.ts index fbb362112b..b0138c2cb4 100644 --- a/apps/dashboard/lib/auth/workos.ts +++ b/apps/dashboard/lib/auth/workos.ts @@ -4,6 +4,7 @@ import { type Invitation as WorkOSInvitation, type Organization as WorkOSOrganization, } from "@workos-inc/node"; +import { getBaseUrl } from "../utils"; import { BaseAuthProvider } from "./base-provider"; import { getCookie } from "./cookies"; import { @@ -192,7 +193,10 @@ export class WorkOSAuthProvider extends BaseAuthProvider { } // Organization Management - async createTenant(params: { name: string; userId: string }): Promise { + async createTenant(params: { + name: string; + userId: string; + }): Promise { const { name, userId } = params; if (!name || !userId) { throw new Error("Organization name and userId are required."); @@ -220,7 +224,9 @@ export class WorkOSAuthProvider extends BaseAuthProvider { } try { - const org = await this.provider.organizations.createOrganization({ name }); + const org = await this.provider.organizations.createOrganization({ + name, + }); return this.transformOrganizationData(org); } catch (error) { throw this.handleError(error); @@ -453,7 +459,10 @@ export class WorkOSAuthProvider extends BaseAuthProvider { inviterUserId: user.id, }); - return this.transformInvitationData(invitation, { orgId, inviterId: user.id }); + return this.transformInvitationData(invitation, { + orgId, + inviterId: user.id, + }); } catch (error) { throw this.handleError(error); } @@ -643,7 +652,10 @@ export class WorkOSAuthProvider extends BaseAuthProvider { } } - async verifyEmail(params: { code: string; token: string }): Promise { + async verifyEmail(params: { + code: string; + token: string; + }): Promise { const { code, token } = params; try { @@ -767,12 +779,13 @@ export class WorkOSAuthProvider extends BaseAuthProvider { // OAuth Methods signInViaOAuth(options: SignInViaOAuthOptions): string { - const { redirectUrl, provider, redirectUrlComplete } = options; + const { provider, redirectUrlComplete } = options; const state = encodeURIComponent(JSON.stringify({ redirectUrlComplete })); - + const baseUrl = getBaseUrl(); + const redirect = `${baseUrl}/auth/sso-callback`; return this.provider.userManagement.getAuthorizationUrl({ clientId: this.clientId, - redirectUri: redirectUrl ?? env().NEXT_PUBLIC_WORKOS_REDIRECT_URI, + redirectUri: env().NEXT_PUBLIC_WORKOS_REDIRECT_URI ?? redirect, provider: provider === "github" ? "GitHubOAuth" : "GoogleOAuth", state, }); diff --git a/apps/dashboard/lib/trpc/server.ts b/apps/dashboard/lib/trpc/server.ts index dbfc998fdc..d8c9c7204b 100644 --- a/apps/dashboard/lib/trpc/server.ts +++ b/apps/dashboard/lib/trpc/server.ts @@ -2,21 +2,7 @@ import { createTRPCProxyClient, httpLink } from "@trpc/client"; import superjson from "superjson"; import type { Router } from "./routers"; - -function getBaseUrl() { - if (typeof window !== "undefined") { - // browser should use relative path - return ""; - } - - if (process.env.VERCEL_URL) { - // reference for vercel.com - return `https://${process.env.VERCEL_URL}`; - } - - // assume localhost - return `http://localhost:${process.env.PORT ?? 3000}`; -} +import { getBaseUrl } from "../utils"; export const trpc = createTRPCProxyClient({ transformer: superjson, diff --git a/apps/dashboard/lib/utils.ts b/apps/dashboard/lib/utils.ts index 3ab78de23b..5462a103b9 100644 --- a/apps/dashboard/lib/utils.ts +++ b/apps/dashboard/lib/utils.ts @@ -168,3 +168,18 @@ export const processTimeFilters = (date?: Date, newTime?: TimeUnit) => { const now = new Date(); return now; }; + +export function getBaseUrl() { + if (typeof window !== "undefined") { + // browser should use relative path + return ""; + } + + if (process.env.VERCEL_URL) { + // reference for vercel.com + return `https://${process.env.VERCEL_URL}`; + } + + // assume localhost + return `http://localhost:${process.env.PORT ?? 3000}`; +} \ No newline at end of file