Supabase Google Login - 基本設定
このプラグインのインストール手順と完全なMarkdownガイドを含むセットアッププロンプトをコピー
はじめに
「はじめに」セクションこのガイドでは、Capacitor Social Login プラグインを使用して、Google Sign-In を Supabase Authentication に統合する方法を説明します。この設定により、モバイルプラットフォームでネイティブな Google Sign-In を利用しながら、バックエンドの認証に Supabase Auth を活用できます。
前提条件
前提条件開始する前に、以下を確認してください:
-
読む Google Login の基本設定 Google OAuth 認証情報の設定ガイド
-
対象プラットフォーム向けの各ガイドに従って、Google OAuth 認証情報を設定してください:
Supabase で Google OAuth プロバイダーを有効にする
「Supabase で Google OAuth プロバイダーを有効にする」というセクション-
ご利用の Supabase ダッシュボード
-
プロジェクトをクリック
-
次に移動するのは
Authenticationメニュー
-
クリックするのは
Providersタブ
-
探すのは
Googleプロバイダー
-
プロバイダーを有効にする
-
使用するプラットフォームのクライアントIDを追加してください
-
クリックするのは
Saveボタン
これで、Supabase Authentication による Google Sign-In の設定は完了です 🎉
Supabase Authentication Helper による Google Sign-In の仕組み
「Supabase Authentication Helperを使用したGoogle Sign-Inの仕組み」セクションこのセクションでは、Google Sign-InとSupabaseの連携が内部でどのように動作するかを解説します。このフローを理解すると、認証プロセスの実装やトラブルシューティングに役立ちます。
1. Nonceの生成
セクション「1. Nonceの生成」実装では、以下に従って安全なnonceペアを生成します: Supabaseのnonce要件:
// Generate URL-safe random noncefunction getUrlSafeNonce(): string { const array = new Uint8Array(32); crypto.getRandomValues(array); return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');}
// Hash the nonce with SHA-256async function sha256Hash(message: string): Promise<string> { const encoder = new TextEncoder(); const data = encoder.encode(message); const hashBuffer = await crypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');}
// Generate nonce pairasync function getNonce(): Promise<{ rawNonce: string; nonceDigest: string }> { const rawNonce = getUrlSafeNonce(); const nonceDigest = await sha256Hash(rawNonce); return { rawNonce, nonceDigest };}フロー:
rawNonce: URLセーフなランダム文字列 (64文字の16進数)nonceDigest: のSHA-256ハッシュrawNonce(16進数エンコード)nonceDigestGoogle Sign-Inに渡されます → GoogleはIDトークンにnonceのダイジェストを含めますrawNonceSupabaseに渡されます → Supabaseは生のnonceをハッシュ化し、トークンのnonceと比較します
2. Google Sign-In
「2. Google Sign-In」セクションこの関数でプラグインを初期化し、Googleでサインインします:
await SocialLogin.initialize({ google: { webClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com', // iOS only: iOSClientId: 'YOUR_IOS_CLIENT_ID.apps.googleusercontent.com', mode: 'online', // Required to get idToken },});
const response = await SocialLogin.login({ provider: 'google', options: { scopes: ['email', 'profile'], nonce: nonceDigest, // Pass the SHA-256 hashed nonce },});3. JWTの検証
「3. JWT Validation」セクショントークンをSupabaseに送信する前に、実装側でJWTトークンの検証を行います:
function validateJWTToken(idToken: string, expectedNonceDigest: string): { valid: boolean; error?: string } { const decodedToken = decodeJWT(idToken);
// Check audience matches your Google Client IDs const audience = decodedToken.aud; if (!VALID_GOOGLE_CLIENT_IDS.includes(audience)) { return { valid: false, error: 'Invalid audience' }; }
// Check nonce matches const tokenNonce = decodedToken.nonce; if (tokenNonce && tokenNonce !== expectedNonceDigest) { return { valid: false, error: 'Nonce mismatch' }; }
return { valid: true };}なぜSupabaseに送る前に検証が必要なのですか?
Supabaseに送信する前にJWTトークンを検証することには、いくつかの重要な目的があります:
-
不正なリクエストの防止: トークンの audience が正しくない、または nonce が一致しない場合、Supabase はトークンを拒否します。事前に検証することで、不要な API 呼び出しを避け、より明確なエラーメッセージを返せます。
-
トークンキャッシュの問題: 一部のプラットフォーム(特に iOS)では、パフォーマンス向上のために Google Sign-In SDK がトークンをキャッシュすることがあります。キャッシュされたトークンが返される際、そのトークンが異なる nonce(または nonce なし)で生成されていると、Supabase で「nonce mismatch」エラーが発生します。Supabase に送信する前に検証を行うことで、この問題を早期に検知し、新しいトークンで自動的にリトライできます。
-
セキュリティ (iOS): iOS での検証により、トークンがお使いの Google Client ID に対して発行されたものであることが保証され、他のアプリ向けのトークンを使用することによるセキュリティリスクを防ぎます。
-
エラーハンドリングの向上: Supabase に送信する前に問題を検知することで、自動リトライロジックを実装できます。これは iOS のキャッシュ問題を透過的に処理するために不可欠です。
検証に失敗した場合、関数は自動的に以下を実行します:
- Google からログアウト(キャッシュされたトークンをクリア - iOS では特に重要)
- 認証を1回リトライ(正しい nonce で新しいトークンの生成を強制)
- リトライも失敗した場合は、エラーを返します
4. Supabaseでのサインイン
「4. Supabaseでのサインイン」というタイトルのセクション最後に、検証済みのトークンがSupabaseに送信されます:
const { data, error } = await supabase.auth.signInWithIdToken({ provider: 'google', token: googleResponse.idToken, nonce: rawNonce, // Pass the raw (unhashed) nonce});Code リファレンスを完了する
「Code リファレンスを完了する」というタイトルのセクション完全な実装は、以下の サンプルアプリの supabaseAuthUtils.ts 以下の内容を含むファイル:
getUrlSafeNonce()- URLセーフなランダムnonceの生成sha256Hash()- SHA-256による文字列のハッシュ化getNonce()- nonceペアの生成decodeJWT()- JWT tokenのデコードvalidateJWTToken()- JWTのaudienceとnonceの検証authenticateWithGoogleSupabase()- 自動リトライ機能付きのメイン認証関数
追加のサンプルファイル
「追加のサンプルファイル」セクション- SupabasePage.tsx - リダイレクト処理を含むコンポーネント例 (Web)
- SupabaseCreateAccountPage.tsx - アカウント作成ページの例
次のステップ
「Next Steps」セクション対象プラットフォームごとのセットアップガイドに進んでください:
Supabase Google Login - General Setup からの続き
「Supabase Google Login - General Setup からの続き」というセクション以下を使用している場合: Supabase Google Login - 基本設定 認証とアカウントフローを計画するには、以下と連携させてください @capgo/capacitor-social-login の使い方 @capgo/capacitor-social-loginの使用におけるネイティブ機能については、 @capgo/capacitor-social-login @capgo/capacitor-social-login の実装詳細については、 @capgo/capacitor-passkey @capgo/capacitor-passkey の実装詳細については、 @capgo/capacitor-native-biometric @capgo/capacitor-native-biometric の実装詳細、および 二要素認証 二要素認証の実装詳細については、