Supabase Google iOS にログイン
このガイドは、iOS で Google サインインと Supabase 認証を統合するのに役立ちます。以下をすでに完了していることを前提としています。
完全な実装は、サンプル アプリの supabaseAuthUtils.ts ファイルで入手できます。このガイドでは、主要な概念とその使用方法について説明します。
認証ヘルパーの使用
Section titled “認証ヘルパーの使用”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 トークンのキャッシュとナンスの問題
Section titled “iOS トークンのキャッシュとナンスの問題”iOS Nonce キャッシュの問題
iOS、Google では、サインインがトークンをキャッシュする可能性があるため、nonce 検証が失敗する可能性があります。 validateJWTToken 関数はこれを検出し、自動的に処理します。
- 自動検出: この関数は、トークン内のノンスが予期された
nonceDigestと一致するかどうかをチェックします。 - 自動再試行: 検証が失敗した場合、Google から自動的にログアウトし、1 回再試行します。
- エラー処理: 再試行も失敗した場合は、エラーが返されます。
これが起こる理由: iOS Google サインイン SDK はパフォーマンスのためにトークンをキャッシュします。キャッシュされたトークンが返されると、異なる nonce (または no nonce) で生成された可能性があり、不一致が発生します。
解決策: 実装では、ログアウトして再試行することでこれを自動的に処理します。これにより、Google は正しいナンスを含む新しいトークンを生成します。
手動による回避策 (自動再試行が機能しない場合):
// Logout first to clear cached tokensawait SocialLogin.logout({ provider: 'google' });
// Then authenticateconst result = await authenticateWithGoogleSupabase();これにより、正しいナンスを含む新しいトークンが確実に取得されます。
完全なコード リファレンスについては、一般セットアップ ガイドの完全なコード リファレンス セクション を参照してください。
重要な注意事項
Section titled “重要な注意事項”nonce の実装は、React Native Google サインイン ドキュメント のパターンに従います。
rawNonceは Supabase のsignInWithIdToken()に移動します- Supabase は、
rawNonceのハッシュを作成し、Google サインインからの ID トークンに含まれるnonceDigestと比較します。 nonceDigest(SHA-256 ハッシュ、16 進エンコード) は、Google サインイン API のnonceパラメーターに送られます。
自動再試行メカニズム
Section titled “自動再試行メカニズム”authenticateWithGoogleSupabase 関数には、retry パラメータが含まれています。
- 最初の呼び出し (
retry=false): 検証が失敗した場合は、自動的にログアウトして 1 回再試行します - 呼び出しの再試行 (
retry=true): 検証が再び失敗した場合は、すぐにエラーを返します。
これにより、iOS トークン キャッシュの問題が自動的に処理されます。
トラブルシューティング
Section titled “トラブルシューティング”認証が失敗した場合:- ノンスの不一致: 関数は自動的に再試行します。詳細については、コンソール ログを確認してください。問題が解決しない場合は、まず手動でログアウトしてください
- 無効な対象者: Google クライアント ID が Google Cloud Console と Supabase (iOS と Web クライアント ID の両方) で一致していることを確認してください。
- トークン検証が失敗します: idToken を取得するための初期化呼び出しで
mode: 'online'を使用していることを確認してください。 - Info.plist 設定: Info.plist に正しい URL スキームと GIDClientID があることを確認してください。
- 参考として サンプル アプリ コード を確認してください。