Lebih lanjut ke konten utama

Cara Masuk dengan Google Menggunakan Capacitor (2026)

Konfigurasi Google Sign-In di sebuah aplikasi Capacitor 8: ID klien, SHA-1, skema URL iOS, Pengelola Kredensial Android, pengecekan token ID, dan perbaikan untuk kesalahan 28444.

Kredit Artikel

Martin Donadieu

Pengarang

Valeria

Pengulas

Jordan

Pengedit

Cara Masuk dengan Google Menggunakan Capacitor (2026)

Untuk menambahkan Google Sign-In ke sebuah aplikasi Capacitor, buatlah klien OAuth Web, iOS, dan satu atau lebih klien OAuth Android di Google Cloud, instal @capgo/capacitor-social-login, panggil SocialLogin.initialize({ google: { webClientId, iOSClientId } }), kemudian SocialLogin.login({ provider: 'google' })Android menggunakan Manajer Kredensial Google, iOS menggunakan Google Sign-In SDK, dan web menggunakan Layanan Identitas Google. Semua tiga kembali dengan token ID yang Anda verifikasi di server Anda.

Petunjuk ini menjelajahi setiap langkah untuk Capacitor 8 Oktober 2026, termasuk bagian yang biasanya rusak: cap fingerprint SHA-1, kunci Play App Signing, dan skema URL iOS.

Bagaimana Google Sign-In bekerja di aplikasi Capacitor

Platform Aplikasi Native API yang digunakan oleh plugin ID Klien yang dikirimkan ke plugin Konfigurasi lainnya di konsol
Android Manajer Kredensial (androidx.credentials) ID Klien Web sebagai webClientId Aplikasi Android dengan nama paket dan SHA-1
iOS Google Sign-In SDK ID Klien iOS sebagai iOSClientId URL Scheme Klien ID yang Dibalik dalam Info.plist
Web Pelayanan Identitas Google Menggunakan ID Klien Web webClientId Asal JavaScript yang Dijabarkan

Google Blokir OAuth di Dalam View Web Terintegrasi dengan disallowed_useragent kesalahan, yang mengapa memuat halaman login Google di dalam Capacitor View Web Anda tidak berfungsi. Plugin menggunakan pilih akun native daripada.

Langkah 1: Konfigurasi Google Cloud

Langkah 1: Konfigurasi Google Cloud

  1. Open Google Cloud Console dan buatlah proyek, atau pilih proyek yang sudah ada. Semua ID klien harus berada di proyek yang sama.
  2. Terbuka Platform Otoritas Google (layar yang sebelumnya disebut “OAuth consent screen”).
  3. Di bawah Pengenalan, atur nama aplikasi yang akan dilihat pengguna, alamat email dukungan, dan URL domain dan kebijakan privasi Anda.
  4. Di bawah Audiencontext External for consumer apps. While the app is in PengujianHanya akun yang terdaftar di Pengguna Uji Bisa masuk.
  5. Akses Data Akses DataTetapkan opsi default openid, email and profile izin lebih luas kecuali Anda memerlukan yang lebih.

You do not need to publish to production or pass verification for the basic scopes. Sensitive scopes (Calendar, Drive, Gmail) need verification before public release.

Create the client IDs

Pergi ke Google Auth Platform > Klien (atau APIs & Services > Kredensial) dan buat:

Tipe klien Apa yang harus Anda masukkan Di mana ID pergi
Aplikasi web Otorisasi asal JavaScript untuk build web Anda (misalnya https://app.example.com, http://localhost:5173) webClientId
iOS ID bundle Anda, plus ID App Store dan ID Tim setelah Anda mendapatkannya iOSClientId
Android (debug) Nama Paket plus SHA-1 Debug Console hanya
Android (release) Nama Paket plus SHA-1 Upload Key Console hanya
Android (Play) Nama Paket plus SHA-1 Play App Signing Console hanya

Dapatkan nilai 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

Untuk aplikasi Play Store, salin nilai SHA-1 dari Console Play > Uji dan rilis > Integritas aplikasi > Sertifikat kunci tanda tangan aplikasi. Jika Anda membutuhkan kunci rilis terlebih dahulu, Generator Kunci Android Membuat satu di browser. Panduan Klien Google kami mengulas lebih lanjut pada layar console. Masuk lebih dalam pada layar konsol.

Langkah 2: Instal Plugin

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

Matikan penyedia yang tidak Anda gunakan agar SDK-nya tidak masuk ke dalam file biner:

// 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;

Run bunx cap sync setelah mengubah penyedia.

Langkah 3: Konfigurasi iOS

Jalankan setelah mengubah penyedia.

Buka klien iOS di Cloud Google dan salin URL Scheme iOS, yang terlihat seperti com.googleusercontent.apps.1234567890-abcdef. Tambahkan ke ios/App/App/Info.plist sebelum penutup </dict>:

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

Jika Anda sudah memiliki CFBundleURLTypes array untuk tautan dalam, tambahkan yang baru <dict> Biarkan Google __CAPGO_KEEP_0__ mengelola URL panggilan balik

Let the Google SDK handle the callback URL

In ios/App/App/AppDelegate.swiftImport SDK dan arahkan URL kepadanya sebelum Capacitor.

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)
}

sehingga ApplicationDelegateProxy tahan panggilan @capacitor/app masih menerima tautan dalam yang lain.

Langkah 4: Konfigurasi Android

Konfigurasi sign-in dasar dengan skop default berfungsi tanpa perubahan native. Jika Anda meminta skop tambahan atau gunakan modus offline, plugin harus menerima hasil aktivitas, sehingga MainActivity harus mengimplementasikan interface penanda plugin:

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() {}
}

Tanpa itu, panggilan dengan scopes ditolak dengan "Anda TIDAK dapat menggunakan skop tanpa mengubah aktivitas utama".

Untuk emulator, gunakan gambar sistem dengan Google Play tanda label dan masuk ke akun Google di pengaturan perangkat. Gambar tanpa Play services kembali NoCredentialException.

Langkah 5: Konfigurasi Web

Tambahkan setiap asal yang Anda layani dari pembangunan web ke klien Web Asal JavaScript yang Diizinkan, termasuk port (http://localhost:5173Panggil initialize awal: plugin menginjeksikan tag skrip Google dan login gagal jika berjalan sebelum skrip siap

Langkah 6: Inisialisasi dan masuk

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;
  }
}

Tanggapan online berisi:

Field Catatan
idToken JWT OpenID Connect. Kirimkan ini ke server Anda
accessToken Menghubungi API Google dari klien. Bisa null Menggunakan Android ketika hanya meminta ruang lingkup default
profile email, name, givenName, familyName, imageUrl, id
responseType 'online'

Pilihan tampilan Android hanya

The options untuk UI sheet bawah, plus style: 'bottom' untuk sheet bawah UI, plus filterByAuthorizedAccounts and autoSelectEnabled untuk pengguna yang sudah terdaftar. Biarkan filterByAuthorizedAccounts mati jika Anda mendukung akun Family Link. forceRefreshToken: true Mengajukan Android untuk mendapatkan token akses segar daripada yang disimpan.

Mengajukan ruang lingkup tambahan

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

Remember the MainActivity perubahan pada Android, dan tambahkan ruang lingkup di bawah Akses Data mode online vs offline

Online (default)

Online (default) Kembali
Returns Token ID, token akses, profil serverAuthCode only
Hanya untuk memverifikasi token Ya, untuk menukar __CAPGO_KEEP_0__ Ya, untuk menukar code.
Token Refres Google Terus dengan Google SDK di perangkat Disimpan di server Anda
Pakai ketika Hanya perlu tahu siapa pengguna itu Server Anda memanggil API Google saat pengguna tidak ada
logout, isLoggedIn, refresh Dukungan Tidak didukung

Pengaturan offline pada iOS memerlukan iOSServerClientId, dan pada Android memerlukan MainActivity change.

Pengeluaran dan pengecekan sesi

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

Pada Android, logout juga menghapus status Manager Kredensial, sehingga pilihan akun muncul lagi kali berikutnya.

Langkah 7: Verifikasi token ID di server Anda

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,
  };
}

Gunakan sub sebagai kunci pengguna stabil. Hanya hubungkan akun yang sudah ada melalui email ketika email_verified adalah true. Menerima kedua ID klien sebagai audiens menjaga token dari setiap platform tetap valid. Kemudian, keluarkan sesi Anda sendiri. Jika Anda menggunakan backend yang diatur, ikuti Supabase dengan Capacitor Login Sosial atau Firebase Guide Google.

Troubleshooting

Kesalahan Penyebab Pembetulan
[28444] Developer console is not set up correctly Nama Paket, SHA-1 atau webClientId Tidak Sesuai Pakai ID Klien Web, daftarkan SHA-1 dari build yang terpasang, simpan semua klien di satu proyek
Berfungsi di debug, gagal dari Play Store Play mere-sign aplikasi Tambahkan klien Android dengan SHA-1 Signing Play App
[16] Account reauth failed Status akun yang dicache sudah ketinggalan, akun bukan pengguna uji, atau pengguna mematikan aplikasi Plugin akan mencoba lagi secara otomatis. Periksa pengguna uji, audiens luar, dan SHA-1 signing Play
NoCredentialException Tidak ada akun Google di perangkat, atau emulator tanpa layanan Play Pakai sistem image Play dan masuk
USER_CANCELLED right after picking an account Sering masih ada kesalahan SHA-1 atau ID klien Fix console setup before treating it as a real cancel
Kerusakan iOS: "tidak ada dukungan untuk skema URL berikutnya" ID klien yang dibalikkan tidak ada di Info.plist Tambahkan com.googleusercontent.apps... skema
Web: "asal asli tidak diizinkan untuk ID klien yang diberikan" Asal asli tidak ada pada klien Web Tambahkan asal asli yang tepat, termasuk port
access_denied dengan "aplikasi belum menyelesaikan proses verifikasi Google" Akun bukan pengguna uji sementara dalam mode Testing Masukkan ke bawah Audience > Pengguna Uji
Google login screen terganggu di iOS @capacitor/privacy-screen menutup SDK view Panggil PrivacyScreen.disable() sebelumnya login

sebelum bekerja pada fitur baru GoogleProviderPlugin ini mencatat nama paket, tanda tangan SHA-1 dan alamat email yang dienkripsi webClientId. Plugin ini mencatat nama paket, tanda tangan SHA-1, dan tanda bintang

Mengirim dan memelihara

Console changes can take a few hours to propagate, so do not rotate client IDs on release day. Once the native setup is in a store build, client-side changes such as scopes, error handling or the backend URL can go out through Capgo live updatesJika tim Anda tidak memiliki Mac untuk rilis iOS, Capgo Pembangunan membangun dan menandatangani file biner iOS di cloud.

Live updates for Capacitor apps

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Terbaru dari Blog

Capgo gives you the best insights you need to create a truly professional mobile app.