Update CORS proxy configuration
This commit is contained in:
@@ -20,15 +20,15 @@ const ProxyTypeSelector: React.FC<ProxyTypeSelectorProps> = ({
|
|||||||
<SelectValue placeholder="프록시 서비스 선택" />
|
<SelectValue placeholder="프록시 서비스 선택" />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
<SelectItem value="corsproxy.io">corsproxy.io (기본)</SelectItem>
|
<SelectItem value="cloudflare">Cloudflare Workers 프록시 (기본)</SelectItem>
|
||||||
|
<SelectItem value="corsproxy.io">corsproxy.io</SelectItem>
|
||||||
<SelectItem value="thingproxy">thingproxy.freeboard.io</SelectItem>
|
<SelectItem value="thingproxy">thingproxy.freeboard.io</SelectItem>
|
||||||
<SelectItem value="allorigins">allorigins.win</SelectItem>
|
<SelectItem value="allorigins">allorigins.win</SelectItem>
|
||||||
<SelectItem value="cors-anywhere">cors-anywhere.herokuapp.com</SelectItem>
|
<SelectItem value="cors-anywhere">cors-anywhere.herokuapp.com</SelectItem>
|
||||||
<SelectItem value="cloudflare">Cloudflare Workers 프록시</SelectItem>
|
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<p className="text-xs text-gray-500 mt-1">
|
<p className="text-xs text-gray-500 mt-1">
|
||||||
특정 프록시 서비스가 작동하지 않으면 다른 서비스를 시도해보세요.
|
Cloudflare 프록시가 가장 안정적인 성능을 제공합니다.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import { supabase } from '@/lib/supabase';
|
import { supabase } from '@/lib/supabase';
|
||||||
import {
|
import {
|
||||||
handleNetworkError,
|
handleNetworkError,
|
||||||
@@ -7,6 +6,7 @@ import {
|
|||||||
verifyServerConnection
|
verifyServerConnection
|
||||||
} from '@/utils/auth';
|
} from '@/utils/auth';
|
||||||
import { signInWithDirectApi } from './signInUtils';
|
import { signInWithDirectApi } from './signInUtils';
|
||||||
|
import { getProxyType, isCorsProxyEnabled } from '@/lib/supabase/config';
|
||||||
|
|
||||||
export const signIn = async (email: string, password: string) => {
|
export const signIn = async (email: string, password: string) => {
|
||||||
try {
|
try {
|
||||||
@@ -14,9 +14,21 @@ export const signIn = async (email: string, password: string) => {
|
|||||||
const connectionStatus = await verifyServerConnection();
|
const connectionStatus = await verifyServerConnection();
|
||||||
if (!connectionStatus.connected) {
|
if (!connectionStatus.connected) {
|
||||||
console.log('서버 연결 실패:', connectionStatus.message);
|
console.log('서버 연결 실패:', connectionStatus.message);
|
||||||
showAuthToast('서버 연결 실패', connectionStatus.message, 'destructive');
|
|
||||||
|
// 프록시 설정 확인 및 추천
|
||||||
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
let errorMessage = connectionStatus.message;
|
||||||
|
|
||||||
|
if (!usingProxy) {
|
||||||
|
errorMessage = `${errorMessage} (설정에서 Cloudflare CORS 프록시 활성화를 권장합니다)`;
|
||||||
|
} else if (proxyType !== 'cloudflare') {
|
||||||
|
errorMessage = `${errorMessage} (설정에서 Cloudflare CORS 프록시로 변경을 권장합니다)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
showAuthToast('서버 연결 실패', errorMessage, 'destructive');
|
||||||
return {
|
return {
|
||||||
error: { message: `서버 연결에 실패했습니다: ${connectionStatus.message}` },
|
error: { message: `서버 연결에 실패했습니다: ${errorMessage}` },
|
||||||
user: null
|
user: null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -66,8 +78,22 @@ export const signIn = async (email: string, password: string) => {
|
|||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('로그인 중 예외 발생:', error);
|
console.error('로그인 중 예외 발생:', error);
|
||||||
|
|
||||||
|
// 프록시 설정 확인 및 추천
|
||||||
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
|
||||||
// 네트워크 오류 확인
|
// 네트워크 오류 확인
|
||||||
const errorMessage = handleNetworkError(error);
|
let errorMessage = handleNetworkError(error);
|
||||||
|
|
||||||
|
// CORS 또는 네트워크 오류인 경우 Cloudflare 프록시 추천
|
||||||
|
if (errorMessage.includes('CORS') || errorMessage.includes('네트워크') || errorMessage.includes('연결')) {
|
||||||
|
if (!usingProxy) {
|
||||||
|
errorMessage = `${errorMessage} (설정에서 Cloudflare CORS 프록시 활성화를 권장합니다)`;
|
||||||
|
} else if (proxyType !== 'cloudflare') {
|
||||||
|
errorMessage = `${errorMessage} (설정에서 Cloudflare CORS 프록시로 변경을 권장합니다)`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
showAuthToast('로그인 오류', errorMessage, 'destructive');
|
showAuthToast('로그인 오류', errorMessage, 'destructive');
|
||||||
|
|
||||||
return { error: { message: errorMessage }, user: null };
|
return { error: { message: errorMessage }, user: null };
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import { supabase } from '@/lib/supabase';
|
import { supabase } from '@/lib/supabase';
|
||||||
import { parseResponse, showAuthToast, handleNetworkError } from '@/utils/auth';
|
import { parseResponse, showAuthToast, handleNetworkError } from '@/utils/auth';
|
||||||
|
import { getProxyType, isCorsProxyEnabled } from '@/lib/supabase/config';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 직접 API 호출을 통한 로그인 시도 (대체 방법)
|
* 직접 API 호출을 통한 로그인 시도 (대체 방법)
|
||||||
@@ -13,6 +14,11 @@ export const signInWithDirectApi = async (email: string, password: string) => {
|
|||||||
const supabaseUrl = localStorage.getItem('supabase_url') || 'https://a11.ism.kr';
|
const supabaseUrl = localStorage.getItem('supabase_url') || 'https://a11.ism.kr';
|
||||||
const supabaseKey = localStorage.getItem('supabase_key') || supabase.supabaseKey;
|
const supabaseKey = localStorage.getItem('supabase_key') || supabase.supabaseKey;
|
||||||
|
|
||||||
|
// 프록시 정보 로그
|
||||||
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
console.log(`CORS 프록시 사용: ${usingProxy ? '예' : '아니오'}, 타입: ${proxyType}`);
|
||||||
|
|
||||||
// URL에 auth/v1이 이미 포함되어있는지 확인
|
// URL에 auth/v1이 이미 포함되어있는지 확인
|
||||||
const baseUrl = supabaseUrl.includes('/auth/v1') ? supabaseUrl : `${supabaseUrl}/auth/v1`;
|
const baseUrl = supabaseUrl.includes('/auth/v1') ? supabaseUrl : `${supabaseUrl}/auth/v1`;
|
||||||
|
|
||||||
@@ -178,9 +184,21 @@ export const signInWithDirectApi = async (email: string, password: string) => {
|
|||||||
} catch (fetchError) {
|
} catch (fetchError) {
|
||||||
console.error('로그인 요청 중 fetch 오류:', fetchError);
|
console.error('로그인 요청 중 fetch 오류:', fetchError);
|
||||||
|
|
||||||
const errorMessage = handleNetworkError(fetchError);
|
// 오류 발생 시 프록시 설정 확인 정보 출력
|
||||||
showAuthToast('로그인 요청 실패', errorMessage, 'destructive');
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
console.log(`오류 발생 시 CORS 설정 - 프록시 사용: ${usingProxy ? '예' : '아니오'}, 타입: ${proxyType}`);
|
||||||
|
|
||||||
return { error: { message: errorMessage }, user: null };
|
// Cloudflare 프록시 추천 메시지 추가
|
||||||
|
const errorMessage = handleNetworkError(fetchError);
|
||||||
|
let enhancedMessage = errorMessage;
|
||||||
|
|
||||||
|
if (!usingProxy || proxyType !== 'cloudflare') {
|
||||||
|
enhancedMessage = `${errorMessage} (설정에서 Cloudflare CORS 프록시 사용을 권장합니다)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
showAuthToast('로그인 요청 실패', enhancedMessage, 'destructive');
|
||||||
|
|
||||||
|
return { error: { message: enhancedMessage }, user: null };
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export const getSupabaseUrl = () => {
|
|||||||
if (storedUrl) {
|
if (storedUrl) {
|
||||||
// CORS 프록시 설정 확인
|
// CORS 프록시 설정 확인
|
||||||
const useProxy = localStorage.getItem('use_cors_proxy') === 'true';
|
const useProxy = localStorage.getItem('use_cors_proxy') === 'true';
|
||||||
const proxyType = localStorage.getItem('proxy_type') || 'corsproxy.io';
|
const proxyType = localStorage.getItem('proxy_type') || 'cloudflare';
|
||||||
|
|
||||||
if (useProxy) {
|
if (useProxy) {
|
||||||
// URL에 이미 프로토콜이 포함되어 있는지 확인
|
// URL에 이미 프로토콜이 포함되어 있는지 확인
|
||||||
@@ -41,7 +41,7 @@ export const getSupabaseUrl = () => {
|
|||||||
proxyUrl = `http://localhost:8080/proxy?url=${encodeURIComponent(urlForProxy)}`;
|
proxyUrl = `http://localhost:8080/proxy?url=${encodeURIComponent(urlForProxy)}`;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
proxyUrl = `https://corsproxy.io/?${encodeURIComponent(urlForProxy)}`;
|
proxyUrl = `https://cors-proxy.azurewebsites.net/api/cors-proxy?url=${encodeURIComponent(urlForProxy)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('CORS 프록시 URL 생성:', proxyUrl);
|
console.log('CORS 프록시 URL 생성:', proxyUrl);
|
||||||
@@ -75,7 +75,7 @@ export const setProxyType = (proxyType: string) => {
|
|||||||
|
|
||||||
// 현재 사용 중인 프록시 유형 가져오기
|
// 현재 사용 중인 프록시 유형 가져오기
|
||||||
export const getProxyType = () => {
|
export const getProxyType = () => {
|
||||||
return localStorage.getItem('proxy_type') || 'corsproxy.io';
|
return localStorage.getItem('proxy_type') || 'cloudflare';
|
||||||
};
|
};
|
||||||
|
|
||||||
// CORS 프록시 사용 여부 확인
|
// CORS 프록시 사용 여부 확인
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
import { supabase } from '@/lib/supabase';
|
import { supabase } from '@/lib/supabase';
|
||||||
|
import { getProxyType, isCorsProxyEnabled } from '@/lib/supabase/config';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CORS 문제 확인
|
* CORS 문제 확인
|
||||||
@@ -37,6 +38,11 @@ export const verifyServerConnection = async (): Promise<{
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 프록시 설정 상태 확인
|
||||||
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
console.log(`연결 테스트 - CORS 프록시: ${usingProxy ? '사용 중' : '미사용'}, 타입: ${proxyType}`);
|
||||||
|
|
||||||
// 단순 헬스 체크 요청
|
// 단순 헬스 체크 요청
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`${supabaseUrl}/auth/v1/`, {
|
const response = await fetch(`${supabaseUrl}/auth/v1/`, {
|
||||||
@@ -92,6 +98,10 @@ export const verifyServerConnection = async (): Promise<{
|
|||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('서버 연결 확인 중 오류:', error);
|
console.error('서버 연결 확인 중 오류:', error);
|
||||||
|
|
||||||
|
// 프록시 설정 확인
|
||||||
|
const usingProxy = isCorsProxyEnabled();
|
||||||
|
const proxyType = getProxyType();
|
||||||
|
|
||||||
// 오류 유형에 따른 메시지 설정
|
// 오류 유형에 따른 메시지 설정
|
||||||
let errorMessage = '알 수 없는 네트워크 오류';
|
let errorMessage = '알 수 없는 네트워크 오류';
|
||||||
|
|
||||||
@@ -111,6 +121,15 @@ export const verifyServerConnection = async (): Promise<{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cloudflare 프록시 추천 메시지 추가
|
||||||
|
if (errorMessage.includes('CORS') || errorMessage.includes('fetch') || errorMessage.includes('네트워크')) {
|
||||||
|
if (!usingProxy) {
|
||||||
|
console.log('CORS 오류 감지, Cloudflare 프록시 사용 권장');
|
||||||
|
} else if (proxyType !== 'cloudflare') {
|
||||||
|
console.log('CORS 오류 감지, Cloudflare 프록시로 변경 권장');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
connected: false,
|
connected: false,
|
||||||
message: errorMessage
|
message: errorMessage
|
||||||
|
|||||||
Reference in New Issue
Block a user