문제 상황
react-native-kakao-login을 이용해서 카카오 로그인을 구현하는데, 아래와 같은 오류가 발생했다.
원인
Supabase Kakao provider의 Client ID(REST API Key)와 네이티브 SDK의 idToken audience(Native App Key)가 불일치해 signInWithIdToken 실패
문제점 : Supabase > Provider > kakao에서는 REST API Key만 설정이 가능하다.
다시말해, Supabsae가 카카오를 네이티브 OAuth Provider로 지원하지 않는다.
해결 방법
Supabase Edge Function에서 카카오 API (/v2/user/me)로 AccessToken 검증 → admin.generateLink(magiclink) → hashed_token 반환 → 클라이언트에서 verifyOtp({ token_hash }) 호출
-
카카오 API로 Access Token 검증 및 사용자 정보 조회
const kakaoRes = await fetch("https://kapi.kakao.com/v2/user/me", { headers: { Authorization: `Bearer ${kakao_access_token}` }, }); const kakaoUser = await kakaoRes.json(); const email = kakaoUser.kakao_account?.email; -
Supabase Admin 클라이언트 생성
const supabaseAdmin = createClient( Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!, ); -
기존 사용자에 대해 magiclink 토큰 생성 시도
let { data: linkData, error: linkError } = await supabaseAdmin.auth.admin.generateLink({ type: "magiclink", email, }); -
사용자가 없으면 생성 후 재시도
if (linkError) { const nickname = kakaoUser.properties?.nickname ?? kakaoUser.kakao_account?.profile?.nickname; const avatarUrl = kakaoUser.properties?.profile_image ?? kakaoUser.kakao_account?.profile?.profile_image_url; const { error: createError } = await supabaseAdmin.auth.admin.createUser({ email, email_confirm: true, user_metadata: { name: nickname, avatar_url: avatarUrl, provider: "kakao", kakao_id: String(kakaoUser.id), }, });
- 앱 입장
-
앱에서 로그인을할 때, supabase.functions.invoke로 위 functions를 실행
supabase.functions.invoke("kakao-auth", { body: { kakao_access_token } })
-
- Edge Function 실행 → hasked_token 반환
- supabase.auth.verifyOtp(): 반환된 토큰으로 Supabase 세션 생성