コンテンツへスキップ

Supabase Google iOS にログイン

このガイドは、iOS で Google サインインと Supabase 認証を統合するのに役立ちます。以下をすでに完了していることを前提としています。

完全な実装は、サンプル アプリの 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 トークンのキャッシュとナンスの問題

Section titled “iOS トークンのキャッシュとナンスの問題”

iOS Nonce キャッシュの問題

iOS、Google では、サインインがトークンをキャッシュする可能性があるため、nonce 検証が失敗する可能性があります。 validateJWTToken 関数はこれを検出し、自動的に処理します。

  1. 自動検出: この関数は、トークン内のノンスが予期された nonceDigest と一致するかどうかをチェックします。
  2. 自動再試行: 検証が失敗した場合、Google から自動的にログアウトし、1 回再試行します。
  3. エラー処理: 再試行も失敗した場合は、エラーが返されます。

これが起こる理由: iOS Google サインイン SDK はパフォーマンスのためにトークンをキャッシュします。キャッシュされたトークンが返されると、異なる nonce (または no nonce) で生成された可能性があり、不一致が発生します。

解決策: 実装では、ログアウトして再試行することでこれを自動的に処理します。これにより、Google は正しいナンスを含む新しいトークンを生成します。

手動による回避策 (自動再試行が機能しない場合):

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

これにより、正しいナンスを含む新しいトークンが確実に取得されます。

完全なコード リファレンスについては、一般セットアップ ガイドの完全なコード リファレンス セクション を参照してください。

nonce の実装は、React Native Google サインイン ドキュメント のパターンに従います。

  • rawNonce は Supabase の signInWithIdToken() に移動します
  • Supabase は、rawNonce のハッシュを作成し、Google サインインからの ID トークンに含まれる nonceDigest と比較します。
  • nonceDigest (SHA-256 ハッシュ、16 進エンコード) は、Google サインイン API の nonce パラメーターに送られます。

authenticateWithGoogleSupabase 関数には、retry パラメータが含まれています。

  • 最初の呼び出し (retry=false): 検証が失敗した場合は、自動的にログアウトして 1 回再試行します
  • 呼び出しの再試行 (retry=true): 検証が再び失敗した場合は、すぐにエラーを返します。

これにより、iOS トークン キャッシュの問題が自動的に処理されます。

認証が失敗した場合:- ノンスの不一致: 関数は自動的に再試行します。詳細については、コンソール ログを確認してください。問題が解決しない場合は、まず手動でログアウトしてください

  • 無効な対象者: Google クライアント ID が Google Cloud Console と Supabase (iOS と Web クライアント ID の両方) で一致していることを確認してください。
  • トークン検証が失敗します: idToken を取得するための初期化呼び出しで mode: 'online' を使用していることを確認してください。
  • Info.plist 設定: Info.plist に正しい URL スキームと GIDClientID があることを確認してください。
  • 参考として サンプル アプリ コード を確認してください。