Fix OIDC authentication behind multiple proxies (#377)

This commit is contained in:
Daniel Luiz Alves 2025-12-10 14:02:51 -03:00 committed by GitHub
commit 35facfef55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 20 additions and 6 deletions

View File

@ -48,8 +48,12 @@ export class AuthProvidersController {
}
private buildRequestContext(request: FastifyRequest): RequestContext {
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = request.headers["x-forwarded-proto"] as string;
const protocol = forwardedProto ? forwardedProto.split(",")[0].trim() : request.protocol;
return {
protocol: (request.headers["x-forwarded-proto"] as string) || request.protocol,
protocol,
host: (request.headers["x-forwarded-host"] as string) || (request.headers.host as string),
headers: request.headers,
};

View File

@ -40,7 +40,9 @@ async function getAppInfo() {
async function getBaseUrl(): Promise<string> {
const headersList = await headers();
const protocol = headersList.get("x-forwarded-proto") || "http";
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = headersList.get("x-forwarded-proto");
const protocol = forwardedProto ? forwardedProto.split(",")[0].trim() : "http";
const host = headersList.get("x-forwarded-host") || headersList.get("host") || "localhost:3000";
return `${protocol}://${host}`;
}

View File

@ -45,7 +45,9 @@ async function getAppInfo() {
async function getBaseUrl(): Promise<string> {
const headersList = await headers();
const protocol = headersList.get("x-forwarded-proto") || "http";
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = headersList.get("x-forwarded-proto");
const protocol = forwardedProto ? forwardedProto.split(",")[0].trim() : "http";
const host = headersList.get("x-forwarded-host") || headersList.get("host") || "localhost:3000";
return `${protocol}://${host}`;
}

View File

@ -8,7 +8,9 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
const url = new URL(request.url);
const queryString = url.search;
const originalHost = request.headers.get("host") || url.host;
const originalProtocol = request.headers.get("x-forwarded-proto") || url.protocol.replace(":", "");
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = request.headers.get("x-forwarded-proto");
const originalProtocol = forwardedProto ? forwardedProto.split(",")[0].trim() : url.protocol.replace(":", "");
const authorizeUrl = `${API_BASE_URL}/auth/providers/${provider}/authorize${queryString}`;
const apiRes = await fetch(authorizeUrl, {

View File

@ -8,7 +8,9 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
const url = new URL(request.url);
const queryString = url.search;
const originalHost = request.headers.get("host") || url.host;
const originalProtocol = request.headers.get("x-forwarded-proto") || url.protocol.replace(":", "");
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = request.headers.get("x-forwarded-proto");
const originalProtocol = forwardedProto ? forwardedProto.split(",")[0].trim() : url.protocol.replace(":", "");
const callbackUrl = `${API_BASE_URL}/auth/providers/${provider}/callback${queryString}`;
const apiRes = await fetch(callbackUrl, {

View File

@ -8,7 +8,9 @@ export async function GET(request: NextRequest) {
const queryString = url.search;
const originalHost = request.headers.get("host") || url.host;
const originalProtocol = request.headers.get("x-forwarded-proto") || url.protocol.replace(":", "");
// Handle multiple protocols in x-forwarded-proto (e.g., "https, https" from multiple proxies)
const forwardedProto = request.headers.get("x-forwarded-proto");
const originalProtocol = forwardedProto ? forwardedProto.split(",")[0].trim() : url.protocol.replace(":", "");
const listUrl = `${API_BASE_URL}/auth/providers${queryString}`;
const apiRes = await fetch(listUrl, {