콘텐츠로 건너뛰기

Supabase Google iOS에 로그인

이 가이드는 iOS에서 Supabase 인증과 Google 로그인을 통합하는 데 도움이 됩니다. 이미 다음 작업을 완료했다고 가정합니다.

전체 구현은 예제 앱의 supabaseAuthUtils.ts 파일에서 확인할 수 있습니다. 이 가이드에서는 주요 개념과 사용 방법을 설명합니다.

authenticateWithGoogleSupabase 함수는 전체 인증 흐름을 처리합니다.

import { authenticateWithGoogleSupabase } from './supabaseAuthUtils';
const result = await authenticateWithGoogleSupabase();
if (result.success) {
console.log('Signed in:', result.user);
// Navigate to your authenticated area
} else {
console.error('Error:', result.error);
}

Nonce 생성, JWT 유효성 검사, Supabase 로그인을 포함하여 인증 흐름이 작동하는 방식에 대한 자세한 설명은 일반 설정 가이드의 작동 방식 섹션을 참조하세요.

iOS Nonce 캐싱 문제

iOS에서 Google 로그인은 토큰을 캐시할 수 있으며 이로 인해 nonce 검증이 실패할 수 있습니다. validateJWTToken 함수는 이를 감지하고 자동으로 처리합니다.

  1. 자동 감지: 이 함수는 토큰의 nonce가 예상되는 nonceDigest과 일치하는지 확인합니다.
  2. 자동 재시도: 검증에 실패하면 Google에서 자동으로 로그아웃하고 한 번 재시도합니다.
  3. 오류 처리: 재시도에도 실패하면 오류가 반환됩니다.

발생 이유: iOS Google 로그인 SDK는 성능을 위해 토큰을 캐시합니다. 캐시된 토큰이 반환되면 다른 nonce(또는 nonce 없음)로 생성되어 불일치가 발생할 수 있습니다.

해결책: 구현에서는 로그아웃하고 다시 시도하여 이를 자동으로 처리합니다. 그러면 Google가 올바른 nonce를 사용하여 새 토큰을 생성하게 됩니다.

수동 해결 방법(자동 재시도가 작동하지 않는 경우):

// Logout first to clear cached tokens
await SocialLogin.logout({ provider: 'google' });
// Then authenticate
const result = await authenticateWithGoogleSupabase();

이렇게 하면 올바른 nonce로 새로운 토큰을 얻을 수 있습니다.

전체 코드 참조는 일반 설정 가이드의 전체 코드 참조 섹션을 참조하세요.

Nonce 구현은 React Native Google 로그인 문서의 패턴을 따릅니다.

  • rawNonce은(는) Supabase의 signInWithIdToken()(으)로 이동합니다.
  • Supabase는 rawNonce의 해시를 만들고 이를 Google의 ID 토큰에 포함된 nonceDigest과 비교합니다.
  • nonceDigest(SHA-256 해시, 16진수 인코딩)은 Google 로그인 API의 nonce 매개변수로 이동합니다.

authenticateWithGoogleSupabase 함수에는 retry 매개변수가 포함되어 있습니다.

  • 첫 번째 호출(retry=false): 유효성 검사에 실패하면 자동으로 로그아웃하고 한 번 재시도합니다.
  • 재시도 호출(retry=true): 유효성 검사가 다시 실패하면 즉시 오류를 반환합니다.

이는 iOS 토큰 캐싱 문제를 자동으로 처리합니다.

인증이 실패하는 경우:- Nonce mismatch: The function automatically retries - check console logs for details. 그래도 지속되면 먼저 수동으로 로그아웃하세요.

  • 잘못된 대상: Google 클라이언트 ID가 Google Cloud Console 및 Supabase(iOS 및 웹 클라이언트 ID 모두)에서 일치하는지 확인하세요.
  • 토큰 유효성 검사 실패: idToken을 가져오기 위한 초기화 호출에서 mode: 'online'을 사용하고 있는지 확인하세요.
  • Info.plist 구성: Info.plist에 올바른 URL 구성표와 GIDClientID가 있는지 확인하세요.
  • 참고용으로 예제 앱 코드를 검토하세요.