Langsung ke konten

Otorisasi OAuth2 Generic

GitHub

Plugin Login Sosial Capgo termasuk mesin OAuth2 dan OpenID Connect yang dibangun. Anda dapat menggunakan itu untuk menghubungkan penyedia identitas berbasis standar, termasuk:

  • GitHub
  • AD Azure / Microsoft Entra ID
  • Auth0
  • Okta
  • Keycloak
  • Pelayan OIDC atau OAuth2 kustom

Aplikasi oauth2 Konfigurasi adalah multi-provder oleh desain. Anda dapat mendaftarkan beberapa penyedia sekaligus dan kemudian memilih satu pada saat login dengan providerId.

ID Klien OAuth Anda

  • URL Redirect yang sesuai dengan skema aplikasi Anda atau URL panggilan balik web
  • Endpoint Otorisasi
  • Endpoint Token untuk alur otorisasi __CAPGO_KEEP_0__ atau
  • A token endpoint for authorization code flow, or an issuerUrl Skop yang diperlukan aplikasi Anda, seperti
  • Konfigurasi Multi-Provider openid profile email

Apa yang Anda butuhkan

Konfigurasi Multi-Provider

Gunakan SocialLogin.initialize() satu kali selama aplikasi startup dan daftar setiap penyedia yang Anda butuhkan:

import { SocialLogin } from '@capgo/capacitor-social-login';
await SocialLogin.initialize({
oauth2: {
github: {
appId: 'your-github-client-id',
authorizationBaseUrl: 'https://github.com/login/oauth/authorize',
accessTokenEndpoint: 'https://github.com/login/oauth/access_token',
redirectUrl: 'myapp://oauth/github',
scope: 'read:user user:email',
pkceEnabled: true,
resourceUrl: 'https://api.github.com/user',
},
azure: {
appId: 'your-azure-client-id',
authorizationBaseUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
accessTokenEndpoint: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
redirectUrl: 'myapp://oauth/azure',
scope: 'openid profile email User.Read',
pkceEnabled: true,
resourceUrl: 'https://graph.microsoft.com/v1.0/me',
},
auth0: {
issuerUrl: 'https://your-tenant.auth0.com',
appId: 'your-auth0-client-id',
redirectUrl: 'myapp://oauth/auth0',
scope: 'openid profile email offline_access',
pkceEnabled: true,
additionalParameters: {
audience: 'https://your-api.example.com',
},
},
},
});

Jika penyedia Anda menampilkan dokumen penemuan OpenID Connect, issuerUrl adalah konfigurasi yang paling sederhana:

await SocialLogin.initialize({
oauth2: {
keycloak: {
issuerUrl: 'https://sso.example.com/realms/mobile',
clientId: 'mobile-app',
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email offline_access',
pkceEnabled: true,
},
},
});

Plugin ini juga mendukung alias-alias OAuth dan OIDC yang umum:

  • clientId sebagai alias dari appId
  • authorizationEndpoint sebagai alias dari authorizationBaseUrl
  • tokenEndpoint sebagai alias dari accessTokenEndpoint
  • endSessionEndpoint sebagai alias dari logoutUrl
  • scopes sebagai alias dari scope

Juga tersedia:

  • additionalParameters untuk pengaturan override permintaan autentikasi
  • additionalTokenParameters untuk pengaturan override pertukaran token
  • additionalResourceHeaders untuk header endpoint sumber daya kustom
  • additionalLogoutParameters dan postLogoutRedirectUrl untuk aliran keluar
  • loginHint, promptdan iosPrefersEphemeralSession

Preset yang kompatibel dengan Auth Connect

Judul bagian “Preset yang kompatibel dengan Auth Connect”

Jika Anda sedang melakukan migrasi dari Ionic Auth Connect dan ingin menjaga nama-nama penyedia yang sama, gunakan SocialLoginAuthConnect.

import { SocialLoginAuthConnect } from '@capgo/capacitor-social-login';
await SocialLoginAuthConnect.initialize({
authConnect: {
auth0: {
domain: 'https://your-tenant.auth0.com',
clientId: 'your-auth0-client-id',
redirectUrl: 'myapp://oauth/auth0',
audience: 'https://your-api.example.com',
},
azure: {
tenantId: 'common',
clientId: 'your-azure-client-id',
redirectUrl: 'myapp://oauth/azure',
},
okta: {
issuer: 'https://dev-12345.okta.com/oauth2/default',
clientId: 'your-okta-client-id',
redirectUrl: 'myapp://oauth/okta',
},
},
});

ID penyedia preset yang didukung:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

Jika penyedia memerlukan endpoint khusus, baiklah menggantinya di preset atau lewati preset dan atur penyedia secara langsung di oauth2.

PilihanTipeDiperlukanDeskripsi
appId / clientIdstringYaIdentifikasi klien OAuth2
issuerUrlBahasa IndonesiaTidakURL dasar penemuan OIDC
authorizationBaseUrl / authorizationEndpointstringYa*URL endpoint otorisasi
accessTokenEndpoint / tokenEndpointstringTidak*URL endpoint token
redirectUrlstringYaURL panggilan balik
scope / scopesstring / string[]TidakIstilah ruang lingkup yang diminta
pkceEnabledbooleanTidakDefault ke true
responseType'code' atau 'token'TidakDefault ke 'code'
resourceUrlstringTidakInformasi pengguna atau endpoint sumber daya
logoutUrl / endSessionEndpointstringTidakURL Logout atau akhir-sesi
postLogoutRedirectUrlstringTidakURL Redirect setelah logout
additionalParametersRecord<string, string>TidakParameter tambahan permintaan autentikasi
additionalTokenParametersRecord<string, string>TidakParameter tambahan permintaan token
additionalResourceHeadersRecord<string, string>TidakKepala tambahan untuk resourceUrl
additionalLogoutParametersRecord<string, string>TidakParameter logout tambahan
loginHintstringTidakSingkat untuk additionalParameters.login_hint
promptstringTidakSingkat untuk additionalParameters.prompt
iosPrefersEphemeralSessionbooleanTidakLebih suka sesi browser sementara pada iOS
logsEnabledbooleanTidakAktifkan verbose debug logging

authorizationBaseUrl dan accessTokenEndpoint hanya optional ketika issuerUrl cukup untuk penemuan. Endpoint eksplisit selalu menang atas nilai yang ditemukan.

const result = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'github',
scope: 'read:user user:email',
loginHint: 'user@example.com',
},
});

Jika Anda ingin melakukan redirect halaman penuh bukan popup: flow: 'redirect' Salin ke clipboard

await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'auth0',
flow: 'redirect',
},
});

Salin ke clipboard

const result = await SocialLogin.handleRedirectCallback();
if (result?.provider === 'oauth2') {
console.log(result.result.providerId);
}

Judul bagian “Status login dan logout”

Salin ke clipboard
const status = await SocialLogin.isLoggedIn({
provider: 'oauth2',
providerId: 'github',
});
await SocialLogin.logout({
provider: 'oauth2',
providerId: 'github',
});

Judul bagian “Token refresh”

Salin ke clipboard
await SocialLogin.refresh({
provider: 'oauth2',
options: {
providerId: 'github',
},
});
const refreshed = await SocialLogin.refreshToken({
provider: 'oauth2',
providerId: 'github',
refreshToken: 'existing-refresh-token',
});

refresh() Jika Anda ingin melakukan redirect halaman penuh bukan popup: refreshToken() Mengizinkan Anda melewati token refresh sendiri dan mengembalikan respons OAuth2 yang segar.

const code = await SocialLogin.getAuthorizationCode({
provider: 'oauth2',
providerId: 'github',
});
console.log(code.accessToken);

Gunakan GitHub ketika Anda ingin aliran aplikasi OAuth sederhana dan data profil dasar:

await SocialLogin.initialize({
oauth2: {
github: {
appId: 'your-github-client-id',
authorizationBaseUrl: 'https://github.com/login/oauth/authorize',
accessTokenEndpoint: 'https://github.com/login/oauth/access_token',
redirectUrl: 'myapp://oauth/github',
scope: 'read:user user:email',
pkceEnabled: true,
resourceUrl: 'https://api.github.com/user',
},
},
});
const githubResult = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'github',
},
});
console.log(githubResult.result.accessToken?.token);
console.log(githubResult.result.resourceData);

Gunakan Azure ketika Anda memerlukan data Microsoft Graph seperti profil pengguna:

await SocialLogin.initialize({
oauth2: {
azure: {
appId: 'your-azure-client-id',
authorizationBaseUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
accessTokenEndpoint: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
redirectUrl: 'myapp://oauth/azure',
scope: 'openid profile email User.Read',
pkceEnabled: true,
resourceUrl: 'https://graph.microsoft.com/v1.0/me',
},
},
});
const azureResult = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'azure',
},
});
console.log(azureResult.result.idToken);
console.log(azureResult.result.resourceData);

Auth0 cocok digunakan ketika Anda memerlukan OIDC plus audiens kustom API :

await SocialLogin.initialize({
oauth2: {
auth0: {
appId: 'your-auth0-client-id',
authorizationBaseUrl: 'https://your-tenant.auth0.com/authorize',
accessTokenEndpoint: 'https://your-tenant.auth0.com/oauth/token',
redirectUrl: 'myapp://oauth/auth0',
scope: 'openid profile email offline_access',
pkceEnabled: true,
additionalParameters: {
audience: 'https://your-api.example.com',
},
},
},
});
const auth0Result = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'auth0',
flow: 'redirect',
},
});

Jika Anda menggunakan aliran redirect di web, baca hasilnya kembali di halaman panggilan balik:

const auth0Result = await SocialLogin.handleRedirectCallback();
if (auth0Result?.provider === 'oauth2') {
console.log(auth0Result.result.idToken);
}
await SocialLogin.initialize({
oauth2: {
okta: {
appId: 'your-okta-client-id',
authorizationBaseUrl: 'https://your-domain.okta.com/oauth2/default/v1/authorize',
accessTokenEndpoint: 'https://your-domain.okta.com/oauth2/default/v1/token',
redirectUrl: 'myapp://oauth/okta',
scope: 'openid profile email offline_access',
pkceEnabled: true,
resourceUrl: 'https://your-domain.okta.com/oauth2/default/v1/userinfo',
},
},
});
const oktaResult = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'okta',
},
});
console.log(oktaResult.result.resourceData);

Pakai penemuan ketika penyedia Anda menerbitkan /.well-known/openid-configuration:

await SocialLogin.initialize({
oauth2: {
keycloak: {
issuerUrl: 'https://sso.example.com/realms/mobile',
clientId: 'mobile-app',
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email offline_access',
pkceEnabled: true,
},
},
});
const keycloakResult = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'keycloak',
},
});
console.log(keycloakResult.result.idToken);

Login OAuth2 sukses kembali:

FieldPengertian
providerIdKunci penyedia yang dikonfigurasi digunakan untuk login
accessTokenToken akses payload atau null
idTokenToken ID OIDC jika penyedia mengembalikannya
refreshTokenToken refresh jika ruang lingkup yang diminta memungkinkannya
resourceDataData JSON mentah diambil dari resourceUrl
scopeIzin yang diberikan
tokenTypeBiasanya bearer
expiresInMasa berlaku token dalam detik
  1. Buat aplikasi OAuth Buka GitHub Pengaturan Pengembang dan buat aplikasi OAuth baru.

  2. Atur URL panggilan balik Gunakan URL redirect aplikasi Anda, misalnya myapp://oauth/github.

  3. Konfigurasi plugin

    await SocialLogin.initialize({
    oauth2: {
    github: {
    appId: 'your-github-client-id',
    authorizationBaseUrl: 'https://github.com/login/oauth/authorize',
    accessTokenEndpoint: 'https://github.com/login/oauth/access_token',
    redirectUrl: 'myapp://oauth/github',
    scope: 'read:user user:email',
    pkceEnabled: true,
    resourceUrl: 'https://api.github.com/user',
    },
    },
    });
  1. Daftarkan aplikasi Buka Azure Portal, buka App registrations, dan buat registrasi aplikasi native atau mobile.

  2. Tambahkan URI redirect Tambahkan URI redirect mobile atau desktop yang sesuai dengan URL panggilan balik aplikasi Anda.

  3. Konfigurasi plugin

    await SocialLogin.initialize({
    oauth2: {
    azure: {
    appId: 'your-azure-client-id',
    authorizationBaseUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
    accessTokenEndpoint: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    redirectUrl: 'myapp://oauth/azure',
    scope: 'openid profile email User.Read',
    pkceEnabled: true,
    resourceUrl: 'https://graph.microsoft.com/v1.0/me',
    },
    },
    });
  1. Buat aplikasi native Buka Auth0 Dashboard dan buatlah aplikasi Native.

  2. Tentukan URL panggilan yang diizinkan Tambahkan URL redirect yang tepat yang digunakan oleh aplikasi Capacitor Anda.

  3. Konfigurasi plugin

    await SocialLogin.initialize({
    oauth2: {
    auth0: {
    appId: 'your-auth0-client-id',
    authorizationBaseUrl: 'https://your-tenant.auth0.com/authorize',
    accessTokenEndpoint: 'https://your-tenant.auth0.com/oauth/token',
    redirectUrl: 'myapp://oauth/auth0',
    scope: 'openid profile email offline_access',
    pkceEnabled: true,
    additionalParameters: {
    audience: 'https://your-api.example.com',
    },
    logoutUrl: 'https://your-tenant.auth0.com/v2/logout',
    },
    },
    });
  1. Buat aplikasi OIDC asli Dalam Console Admin Okta, buat Aplikasi OIDC Asli.

  2. Tambahkan URI redirect Anda. Daftarkan URL panggil balik yang tepat yang digunakan oleh aplikasi Anda.

  3. Konfigurasi plugin

    await SocialLogin.initialize({
    oauth2: {
    okta: {
    appId: 'your-okta-client-id',
    authorizationBaseUrl: 'https://your-domain.okta.com/oauth2/default/v1/authorize',
    accessTokenEndpoint: 'https://your-domain.okta.com/oauth2/default/v1/token',
    redirectUrl: 'myapp://oauth/okta',
    scope: 'openid profile email offline_access',
    pkceEnabled: true,
    resourceUrl: 'https://your-domain.okta.com/oauth2/default/v1/userinfo',
    },
    },
    });

Jika penyedia Anda mendukung penemuan OpenID Connect, prefer issuerUrl:

await SocialLogin.initialize({
oauth2: {
keycloak: {
issuerUrl: 'https://sso.example.com/realms/mobile',
clientId: 'mobile-app',
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email offline_access',
pkceEnabled: true,
},
},
});

Jika penemuan tidak tersedia, konfigurasi endpoint otorisasi dan token secara manual.

  • Plugin ini menggunakan ASWebAuthenticationSession.
  • Tetapkan iosPrefersEphemeralSession: true jika Anda ingin sesi browser pribadi tanpa kuki yang dibagikan.
  • Pengalihan OAuth kembali melalui skema dan host aplikasi Anda.
  • Pastikan URL panggilan provider Anda tepat sama dengan pengaturan tautan dalam aplikasi Android Anda.
  • Plugin sudah menghandle aktivitas OAuth. Hanya tambahkan filter intent kustom jika aplikasi Anda memerlukan pola redirect yang berbeda.
  • Aliran popup adalah default dan berfungsi baik untuk aplikasi single-page.
  • Aliran redirect lebih baik ketika penyedia menghalangi popup atau aturan autentikasi Anda memerlukan navigasi tingkat atas.
  • Beberapa penyedia menghalangi pertukaran token browser langsung dengan CORS. Dalam kasus tersebut, gunakan pertukaran backend atau pengaturan penyedia yang memungkinkan klien publik.
  1. Gunakan PKCE Tetapkan pkceEnabled: true untuk klien publik.

  2. Preferensi aliran code lebih aman daripada aliran implisit. responseType: 'code' Validasi token di backend Anda

  3. Menguraikan dan memeriksa emiten, audiens, kedaluwarsa, dan tanda tangan di sisi server. Simpan token refresh dengan aman

  4. Untuk aplikasi native, pairkan plugin ini dengan @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-akun-persistent @capgo/capacitor-persistent-account.

  5. Endpoint autentikasi produksi dan logout harus selalu menggunakan HTTPS. Pengaturan Masalah

Setiap metode OAuth2 memerlukan kunci penyedia yang telah dikonfigurasi:

await SocialLogin.login({
provider: 'oauth2',
options: { providerId: 'github' },
});

Panggil SocialLogin.initialize() sebelum login dan pastikan providerId sama dengan kunci objek di bawah oauth2.

  • Bandingkan URL redirect yang telah dikonfigurasi di aplikasi dan dashboard penyedia karakter per karakter.
  • Perhatikan apakah ada slash akhir, kesalahan skema, dan host yang berbeda.
  • Pastikan URL skema aplikasi seluler terdaftar sebelum melakukan pengujian pada perangkat.

Tidak ada token refresh yang dikembalikan

Bab berjudul “Tidak ada token refresh yang dikembalikan”

Sebagian besar penyedia hanya mengembalikan token refresh ketika Anda meminta akses seperti offline_access atau secara eksplisit memaksa persetujuan. Tinjau kebijakan penyedia secara spesifik.

Aktifkan logsEnabled: true pada konfigurasi penyedia untuk memeriksa URL yang dihasilkan dan detail pengubahan token.

Jika Anda menggunakan Pengguna OAuth2 Umum untuk merencanakan autentikasi dan aliran akun, hubungkannya dengan Menggunakan @capgo/capacitor-login-media sosial untuk kemampuan asli dalam Menggunakan @capgo/capacitor-login-media sosial, @capgo/capacitor-login-media sosial untuk detail implementasi dalam @capgo/capacitor-login-media sosial, @capgo/capacitor-kunci akses untuk detail implementasi dalam @capgo/capacitor-kunci akses, @capgo/capacitor-biometrik native untuk detail implementasi di @capgo/capacitor-biometrik native, dan Autentikasi dua faktor untuk detail implementasi di Autentikasi dua faktor.