diff --git a/packages/reservation-platform/setup-backend-url.sh b/packages/reservation-platform/setup-backend-url.sh index d7c982c..8c877d0 100755 --- a/packages/reservation-platform/setup-backend-url.sh +++ b/packages/reservation-platform/setup-backend-url.sh @@ -39,6 +39,9 @@ cat > "$ENV_FILE" << EOL # Backend API Konfiguration NEXT_PUBLIC_API_URL=${BACKEND_URL} +# Frontend-URL für OAuth Callback +NEXT_PUBLIC_FRONTEND_URL=http://$(hostname):3000 + # OAuth Konfiguration (falls nötig) OAUTH_CLIENT_ID=client_id OAUTH_CLIENT_SECRET=client_secret diff --git a/packages/reservation-platform/src/app/auth/login/callback/route.ts b/packages/reservation-platform/src/app/auth/login/callback/route.ts index cef056f..1ca5f64 100644 --- a/packages/reservation-platform/src/app/auth/login/callback/route.ts +++ b/packages/reservation-platform/src/app/auth/login/callback/route.ts @@ -34,7 +34,12 @@ export async function GET(request: Request): Promise { } try { - const tokens = await github.validateAuthorizationCode(code); + // Explizit die redirect_uri übergeben, um Konsistenz zu gewährleisten + const callbackUrl = new URL("/auth/login/callback", process.env.NEXT_PUBLIC_FRONTEND_URL || "http://localhost:3000").toString(); + + // Übergabe der redirect_uri bei der Token-Validierung + const tokens = await github.validateAuthorizationCode(code, callbackUrl); + const githubUserResponse = await fetch("https://git.i.mercedes-benz.com/api/v3/user", { headers: { Authorization: `Bearer ${tokens.accessToken}`, diff --git a/packages/reservation-platform/src/app/auth/login/route.ts b/packages/reservation-platform/src/app/auth/login/route.ts index dcc8462..c7973f0 100644 --- a/packages/reservation-platform/src/app/auth/login/route.ts +++ b/packages/reservation-platform/src/app/auth/login/route.ts @@ -6,8 +6,13 @@ export const dynamic = "force-dynamic"; export async function GET(): Promise { const state = generateState(); + + // Explizit die redirect_uri übergeben, um Konsistenz zu gewährleisten + const callbackUrl = new URL("/auth/login/callback", process.env.NEXT_PUBLIC_FRONTEND_URL || "http://localhost:3000").toString(); + const url = await github.createAuthorizationURL(state, { scopes: ["user"], + redirectURI: callbackUrl, }); const ONE_HOUR = 60 * 60; @@ -19,5 +24,9 @@ export async function GET(): Promise { sameSite: "lax", }); + // Log zur Fehlersuche + console.log(`GitHub OAuth redirect zu: ${url.toString()}`); + console.log(`Verwendete Callback-URL: ${callbackUrl}`); + return Response.redirect(url); } diff --git a/packages/reservation-platform/src/server/auth/oauth.ts b/packages/reservation-platform/src/server/auth/oauth.ts index 44aa033..8146f03 100644 --- a/packages/reservation-platform/src/server/auth/oauth.ts +++ b/packages/reservation-platform/src/server/auth/oauth.ts @@ -1,8 +1,38 @@ import { GitHub } from "arctic"; -export const github = new GitHub(process.env.OAUTH_CLIENT_ID as string, process.env.OAUTH_CLIENT_SECRET as string, { - enterpriseDomain: "https://git.i.mercedes-benz.com", -}); +// Bestimme die Callback-URL basierend auf der NEXT_PUBLIC_API_URL für das Backend +// und dem Standardport 3000 für das Frontend +const getCallbackUrl = () => { + // Extrahiere die Basis-URL (Hostname) aus der Backend-URL, falls vorhanden + let baseUrl = "http://localhost:3000"; + + try { + const apiUrlEnv = process.env.NEXT_PUBLIC_API_URL; + + if (apiUrlEnv) { + // Wenn wir eine Backend-URL haben, extrahieren wir nur den Hostname-Teil für das Frontend + const apiUrl = new URL(apiUrlEnv); + const hostname = apiUrl.hostname; + + // Verwende den Hostname, aber mit Frontend-Port 3000 + baseUrl = `http://${hostname}:3000`; + } + } catch (error) { + console.error("Fehler beim Parsen der API-URL:", error); + // Fallback auf localhost + } + + return `${baseUrl}/auth/login/callback`; +}; + +export const github = new GitHub( + process.env.OAUTH_CLIENT_ID as string, + process.env.OAUTH_CLIENT_SECRET as string, + { + enterpriseDomain: "https://git.i.mercedes-benz.com", + redirectURI: getCallbackUrl(), + } +); export interface GitHubUserResult { id: number; diff --git a/raspi-frontend-deploy.sh b/raspi-frontend-deploy.sh index 36099cf..0fd4b1e 100755 --- a/raspi-frontend-deploy.sh +++ b/raspi-frontend-deploy.sh @@ -102,6 +102,9 @@ configure_backend_url() { # Backend API Konfiguration NEXT_PUBLIC_API_URL=${backend_url} +# Frontend-URL für OAuth Callback +NEXT_PUBLIC_FRONTEND_URL=http://$(hostname):3000 + # OAuth Konfiguration (falls nötig) OAUTH_CLIENT_ID=client_id OAUTH_CLIENT_SECRET=client_secret @@ -241,6 +244,7 @@ services: container_name: ${CONTAINER_NAME} environment: - NEXT_PUBLIC_API_URL=${BACKEND_URL} + - NEXT_PUBLIC_FRONTEND_URL=http://$(hostname):3000 - OAUTH_CLIENT_ID=client_id - OAUTH_CLIENT_SECRET=client_secret ports: @@ -302,6 +306,7 @@ start_container_run() { if ! docker run -d --name "$CONTAINER_NAME" \ -p 3000:3000 \ -e "NEXT_PUBLIC_API_URL=$BACKEND_URL" \ + -e "NEXT_PUBLIC_FRONTEND_URL=http://$(hostname):3000" \ -e "OAUTH_CLIENT_ID=client_id" \ -e "OAUTH_CLIENT_SECRET=client_secret" \ -v "$DB_VOLUME_DIR:/app/db" \