From 3df1f342fc3aa47cf8aca98621f6e9b981606123 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Wed, 13 Aug 2025 18:51:10 +0700 Subject: [PATCH] :necktie: (oauth) add callback URI options provides the option to define a callback URI following a request from the frontend; if not defined, it will automatically use the backend's default URI. --- .env.example | 2 +- src/modules/auth/controllers/githubRequest.controller.ts | 8 +++++--- src/modules/auth/providers/github.provider.ts | 7 ++++--- src/modules/auth/services/http/githubRequest.service.ts | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index e86e133..2255843 100644 --- a/.env.example +++ b/.env.example @@ -34,7 +34,7 @@ DATABASE_URL= GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= -GITHUB_CLIENT_CALLBACK= +GITHUB_DEFAULT_CALLBACK= GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= diff --git a/src/modules/auth/controllers/githubRequest.controller.ts b/src/modules/auth/controllers/githubRequest.controller.ts index 9607e42..d3d332c 100644 --- a/src/modules/auth/controllers/githubRequest.controller.ts +++ b/src/modules/auth/controllers/githubRequest.controller.ts @@ -2,12 +2,14 @@ import { Context } from "elysia"; import { returnReadResponse } from "../../../helpers/callback/httpResponse"; import { githubRequestService } from "../services/http/githubRequest.service"; -export const githubRequestController = async (ctx: Context) => { - const loginUrl = await githubRequestService(); +export const githubRequestController = async ( + ctx: Context & { query: { callback?: string } } +) => { + const loginUrl = await githubRequestService(ctx.query.callback); return returnReadResponse( ctx.set, 200, "Login URL generated successfully", - String(loginUrl) + loginUrl ); }; diff --git a/src/modules/auth/providers/github.provider.ts b/src/modules/auth/providers/github.provider.ts index c231ac8..cd94a61 100644 --- a/src/modules/auth/providers/github.provider.ts +++ b/src/modules/auth/providers/github.provider.ts @@ -1,10 +1,11 @@ import { GitHub } from "arctic"; -export const githubProvider = () => { - const redirectURI = `${process.env.APP_PROTOCOL}://${process.env.APP_DOMAIN}${process.env.GITHUB_CLIENT_CALLBACK}`; +export const githubProvider = ( + callbackURI = `${process.env.APP_PROTOCOL}://${process.env.APP_DOMAIN}${process.env.GITHUB_DEFAULT_CALLBACK}` +) => { return new GitHub( process.env.GITHUB_CLIENT_ID!, process.env.GITHUB_CLIENT_SECRET!, - redirectURI + callbackURI ); }; diff --git a/src/modules/auth/services/http/githubRequest.service.ts b/src/modules/auth/services/http/githubRequest.service.ts index d19f069..82a27c4 100644 --- a/src/modules/auth/services/http/githubRequest.service.ts +++ b/src/modules/auth/services/http/githubRequest.service.ts @@ -2,9 +2,9 @@ import * as arctic from "arctic"; import { githubProvider } from "../../providers/github.provider"; import { AppError } from "../../../../helpers/error/instances/app"; -export const githubRequestService = async () => { +export const githubRequestService = async (callbackURI?: string) => { try { - const github = githubProvider(); + const github = githubProvider(callbackURI); const state = arctic.generateState(); const scopes = ["user:email"]; const url = github.createAuthorizationURL(state, scopes);