メインコンテンツへスキップ

Capacitor を使用した Google ログインの実装方法 (2026)

Capacitor 8 アプリでの Google Sign-In 設定: クライアント ID、SHA-1、iOS URL scheme、Android Credential Manager、ID token の検証、エラー 28444 の修正方法。

Capgo Social Login プラグインを使った Capacitor アプリ内の Google によるログイン アカウント選択画面

Capacitor アプリに Google Sign-In を追加するには、Google Cloud で Web、iOS、および 1 つ以上の Android 用 OAuth クライアント ID を作成し、次をインストールします @capgo/capacitor-social-login、呼び出し SocialLogin.initialize({ google: { webClientId, iOSClientId } })、次に SocialLogin.login({ provider: 'google' })。Android は Google の Credential Manager、iOS は Google Sign-In SDK、Web は Google Identity Services を使用します。いずれもサーバーで検証できる ID トークンを返します。

このガイドでは、2026年10月時点の Capacitor 8 について、SHA-1 フィンガープリント、Play App Signing キー、iOS の URL スキームなど、よく壊れる部分も含めて全手順を解説します。

Capacitor アプリでの Google によるログインの仕組み

プラットフォーム プラグインが使用するネイティブ API プラグインに渡す Client ID その他のコンソール設定
Androidでは Credential Manager (androidx.credentials) Web クライアント ID として webClientId パッケージ名と SHA-1 を持つ Android クライアント
iOSと SDK で Google Sign-In を実装する方法 iOS クライアント ID として iOSClientId リバースクライアント ID の URL スキームを Info.plist
Web Google Identity Services Web クライアント ID として webClientId 承認済みの JavaScript 生成元

Google は、埋め込み WebView 内での OAuth を disallowed_useragent エラーでブロックします。そのため、Capacitor WebView 内で Google のログインページを読み込んでも動作しません。このプラグインでは、代わりにネイティブのアカウントピッカーを使用します。

ステップ 1: Google Cloud の設定

プロジェクトと Google Auth Platform を作成

  1. 開く Google Cloud Console でプロジェクトを作成するか、既存のプロジェクトを選択してください。すべてのクライアント ID は同じプロジェクトに属している必要があります。
  2. 開く Google Auth プラットフォーム (以前は「OAuth 同意画面」と呼ばれていた画面)
  3. 未満 ブランディングユーザーに表示されるアプリ名、サポート用メールアドレス、ドメイン、プライバシーポリシーの URL を設定します。
  4. 未満 対象ユーザーを選択し、 外部 コンシューマー向けアプリ用です。アプリがテストモードの間は テスト、サインインできるのは テストユーザー に登録されているアカウントのみです。
  5. 未満 データへのアクセス、必要がなければデフォルトの openid, email と profile スコープを維持してください。

基本的なスコープでは、本番環境への公開や審査に通る必要はありません。機密性の高いスコープ(Calendar、Drive、Gmail)は、一般公開前に審査が必要です。

クライアントIDの作成

以下に移動します: Google Auth Platform > クライアント (または APIとサービス > 認証情報) を作成します:

クライアントタイプ 入力内容 ID の入力場所
Web アプリケーション Webビルド用の承認済みJavaScriptオリジン(例: https://app.example.com, http://localhost:5173) webClientId
iOSと Bundle ID、取得後はApp Store IDとTeam IDも iOSClientId
Android (デバッグ) パッケージ名とdebug SHA-1 Consoleのみ
Android (リリース版) パッケージ名とupload key SHA-1 Consoleのみ
Android (Play Store) パッケージ名とPlay App Signing SHA-1 Consoleのみ

SHA-1の値を取得するには:

# Debug key and any signing config in build.gradle
cd android && ./gradlew signingReport

# From a signed APK you actually install
keytool -printcert -jarfile android/app/build/outputs/apk/release/app-release.apk

Play Storeビルドの場合は、以下からSHA-1をコピーしてください: Play Console > Test and release > App integrity > App signing key certificate。まずリリース用 keystore が必要な場合は、 Android keystore ジェネレーター がブラウザ上で作成します。当社の GoogleクライアントIDガイド コンソールの画面について詳しく説明します。

ステップ 2: プラグインのインストール

bun add @capgo/capacitor-social-login
bunx cap sync

使用しないプロバイダーを無効化し、そのSDKがバイナリに含まれないようにします:

// capacitor.config.ts
import type { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'Example',
  webDir: 'dist',
  plugins: {
    SocialLogin: {
      providers: {
        google: true,
        apple: true,
        facebook: false,
        twitter: false,
      },
    },
  },
};

export default config;

実行 bunx cap sync プロバイダーを変更した後。

ステップ3: iOS設定

逆転したクライアントIDのURLスキームを追加

Google CloudのiOSクライアントを開き、 iOS URLスキーム(例: com.googleusercontent.apps.1234567890-abcdef)をコピーします。これを ios/App/App/Info.plist 閉じタグの前に </dict>:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>com.googleusercontent.apps.1234567890-abcdef</string>
    </array>
  </dict>
</array>

すでに CFBundleURLTypes ディープリンク用の配列がある場合は、新しい <dict> エントリを追加し、2つ目のキーを作成しないでください。

コールバックURLはGoogle SDK に処理させます

では ios/App/App/AppDelegate.swift、SDK をインポートし、Capacitor の前にURLをルーティングします:

import GoogleSignIn // add at the top of the file

// Replace the generated application(_:open:options:) method
func application(_ app: UIApplication, open url: URL,
                 options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    if GIDSignIn.sharedInstance.handle(url) {
        return true
    }
    return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
}

この ApplicationDelegateProxy 呼び出しても @capacitor/app 他のディープリンクは引き続き受信します。

ステップ 4: Android の設定

デフォルトのスコープでの基本的なサインインは、ネイティブの変更なしで動作します。次の場合: 追加のスコープ または オフラインモードを使用する場合、プラグインが Activity の結果を受け取る必要があるため、 MainActivity プラグインのマーカーインターフェースを実装する必要があります:

package com.example.app;

import android.content.Intent;
import com.getcapacitor.BridgeActivity;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginHandle;
import ee.forgr.capacitor.social.login.GoogleProvider;
import ee.forgr.capacitor.social.login.ModifiedMainActivityForSocialLoginPlugin;
import ee.forgr.capacitor.social.login.SocialLoginPlugin;

public class MainActivity extends BridgeActivity implements ModifiedMainActivityForSocialLoginPlugin {

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode >= GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MIN
                && requestCode < GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MAX) {
            PluginHandle handle = getBridge().getPlugin("SocialLogin");
            if (handle == null) return;
            Plugin plugin = handle.getInstance();
            if (plugin instanceof SocialLoginPlugin) {
                ((SocialLoginPlugin) plugin).handleGoogleLoginIntent(requestCode, data);
            }
        }
    }

    @Override
    public void IHaveModifiedTheMainActivityForTheUseWithSocialLoginPlugin() {}
}

これがない場合、スコープを使用した呼び出しは scopes “You CANNOT use scopes without modifying the main activity” で拒否されます。

エミュレーターでは、次を含むシステムイメージを使用してください: Google Play ラベルを確認し、デバイスの設定で Google アカウントにサインインしてください。Play services のないイメージは返します NoCredentialException.

ステップ 5: Web 設定

Web ビルドを配信するすべてのオリジンを、Web クライアントの 承認済みの JavaScript 生成元、ポート番号を含めて(http://localhost:5173)。呼び出しは initialize 早めに: プラグインが Google の script タグを注入するため、スクリプトの準備ができる前に実行するとログインに失敗します。

ステップ 6: 初期化とサインイン

import { SocialLogin } from '@capgo/capacitor-social-login';

const WEB_CLIENT_ID = '1234567890-web.apps.googleusercontent.com';
const IOS_CLIENT_ID = '1234567890-ios.apps.googleusercontent.com';

export async function initAuth() {
  await SocialLogin.initialize({
    google: {
      webClientId: WEB_CLIENT_ID, // Android + web
      iOSClientId: IOS_CLIENT_ID, // iOS
      iOSServerClientId: WEB_CLIENT_ID, // same as webClientId, required for offline mode on iOS
      mode: 'online',
    },
  });
}

export async function signInWithGoogle() {
  try {
    const { result } = await SocialLogin.login({
      provider: 'google',
      options: {},
    });

    if (result.responseType !== 'online' || !result.idToken) {
      throw new Error('Expected an ID token from Google');
    }

    const res = await fetch('https://api.example.com/auth/google', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ idToken: result.idToken }),
    });
    return res.json();
  } catch (error: any) {
    if (error?.code === 'USER_CANCELLED') return null;
    throw error;
  }
}

オンラインレスポンスには以下が含まれます:

項目 備考
idToken OpenID Connect JWT。これをサーバーに送信します
accessToken クライアントからGoogle APIを呼び出すために使用します。 null Androidでは、デフォルトのスコープのみを要求する場合に
profile email, name, givenName, familyName, imageUrl, id
responseType 'online'

Android専用の表示オプション

この options object を受け取ります style: 'bottom' ボトムシート UI に、さらに filterByAuthorizedAccounts と autoSelectEnabled 既存ユーザー向けです。 filterByAuthorizedAccounts Family Link アカウントをサポートする場合はオフにしてください。 forceRefreshToken: true Android にキャッシュされたトークンではなく、新しいアクセストークンを要求します。

追加スコープの要求

const { result } = await SocialLogin.login({
  provider: 'google',
  options: {
    scopes: ['https://www.googleapis.com/auth/calendar.readonly'],
  },
});

を覚えておいてください MainActivity Android での変更、およびスコープの追加 データへのアクセス Google Cloud 内

オンラインモード vs オフラインモード

オンライン(デフォルト) オフライン
戻り値 IDトークン、アクセストークン、プロフィール serverAuthCode のみ
バックエンドが必要 トークンの検証のみ はい、codeを交換するためです
Googleリフレッシュトークン デバイス上のGoogle SDKに残ります サーバーに保存
使用シーン ユーザーが誰かだけ分かればよい場合 ユーザーがオフラインの間にサーバーがGoogle APIを呼び出す場合
logout, isLoggedIn, refresh 対応 非対応

iOSのオフラインモードには iOSServerClientId、Androidでは次の MainActivity 変更が必要です。

ログアウトとセッション確認

await SocialLogin.isLoggedIn({ provider: 'google' }); // { isLoggedIn: boolean }
await SocialLogin.logout({ provider: 'google' });

Androidの場合、 logout Credential Managerの状態もクリアされるので、次回もアカウント選択画面が表示されます。

ステップ 7: サーバー側でIDトークンを検証する

import { OAuth2Client } from 'google-auth-library';

const client = new OAuth2Client();

export async function verifyGoogleToken(idToken: string) {
  const ticket = await client.verifyIdToken({
    idToken,
    audience: [
      '1234567890-web.apps.googleusercontent.com',
      '1234567890-ios.apps.googleusercontent.com',
    ],
  });
  const payload = ticket.getPayload();
  if (!payload) throw new Error('Empty token payload');

  return {
    googleUserId: payload.sub,
    email: payload.email,
    emailVerified: payload.email_verified === true,
    name: payload.name,
  };
}

使用する sub を安定したユーザーキーとして使用します。既存のアカウントをメールで紐付けるのは、次の場合のみです: email_verified が true両方のクライアントIDをaudienceとして受け入れることで、全プラットフォームのトークンが有効になります。その後、独自のセッションを発行してください。マネージドバックエンドを使っている場合は、こちらに従ってください。 Supabase と Capacitor Social Login または Firebase Google ガイド. Neon Auth はOAuthリダイレクト経由でGoogleを処理し、 @capgo/capacitor-neon ネイティブで動作します。

トラブルシューティング

エラー 原因 解決策
[28444] Developer console is not set up correctly パッケージ名、SHA-1または webClientId 不一致 WebクライアントIDを使い、インストール済みbuildのSHA-1を登録し、すべてのクライアントを1つのプロジェクトにまとめる
debugでは動くが、Play Store版では失敗する Playがアプリを再署名する Play App SigningのSHA-1でAndroidクライアントを追加する
[16] Account reauth failed アカウントのキャッシュ状態が古い、アカウントがテストユーザーでない、またはユーザーがアプリを無効にしている プラグインは自動で1回リトライします。テストユーザー、External audience、Play署名のSHA-1を確認してください
NoCredentialException デバイスにGoogleアカウントがない、またはPlay servicesがないエミュレーター Google Playシステムイメージを使用してサインインする
USER_CANCELLED アカウントを選択した直後に 通常はやはりSHA-1かクライアントIDの不一致です 実際のキャンセルとして扱う前に、コンソールの設定を直す
iOSクラッシュ: “missing support for the following URL schemes” に逆クライアント ID がありません Info.plist 次を追加します: com.googleusercontent.apps... スキーム
Web: “指定されたオリジンは、指定されたクライアント ID に対して許可されていません” Web クライアントに Origin がありません ポートを含む正確な Origin を追加
access_denied “app has not completed the Google verification process” テスト中なのにアカウントがテストユーザーではありません Audience > Test users に追加してください
iOS で Google ログイン画面が中断される @capacitor/privacy-screen SDK ビューをカバーします 呼び出す PrivacyScreen.disable() の前に login

Android では、Logcat を以下でフィルタリングします GoogleProvider。プラグインはパッケージ名、署名用 SHA-1、およびマスクされた値をログに出力します webClientId。これはコンソールとすぐに比較できます。

リリースとメンテナンス

コンソールの変更は反映に数時間かかることがあるため、リリース日にクライアント ID をローテーションしないでください。ネイティブ設定がストアビルドに含まれれば、スコープ、エラー処理、バックエンド URL などのクライアント側の変更は配信できます Capgo Live Updates。iOS リリース用の Mac がチームにない場合、 Capgo のビルド クラウドで iOS バイナリをビルドして署名します。

Capacitor アプリ向けの Live Updates

Web レイヤーのバグが本番で発生したら、App Store の審査を何日も待たずに Capgo で修正を配信しましょう。ネイティブの変更は通常の審査フローに残したまま、ユーザーはバックグラウンドでアップデートを受け取れます。

最新のブログ記事

Capgoは、真にプロフェッショナルなモバイルアプリを作るために必要な最高のインサイトを提供します。