Vai al contenuto

Provider OAuth2 generici

GitHub

Il plugin Capgo Social Login include un motore OAuth2 e OpenID Connect integrato. Puoi usarlo per connettere qualsiasi identity provider standard, tra cui:

  • GitHub
  • Azure AD / Microsoft Entra ID
  • Auth0
  • Okta
  • Keycloak
  • Server OAuth2 o OIDC personalizzati

Il oauth2 la configurazione è multi-provider per design. Puoi registrare più provider contemporaneamente e selezionarne uno al login con providerId.

Prima di configurare un provider, recupera:

  • Il tuo OAuth client ID
  • Un redirect URL che corrisponda allo scheme della tua app o all'URL di callback web
  • Un authorization endpoint
  • Un token endpoint per il flusso di autorizzazione code, oppure un issuerUrl per l'OIDC discovery
  • Gli scope necessari alla tua app, come openid profile email

Usa SocialLogin.initialize() una sola volta all'avvio dell'app e registra ogni provider necessario:

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

Se il tuo provider espone un documento di discovery OpenID Connect, issuerUrl la configurazione più semplice è:

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

Il plugin supporta anche i comuni alias OAuth e OIDC:

  • clientId come alias di appId
  • authorizationEndpoint come alias di authorizationBaseUrl
  • tokenEndpoint come alias di accessTokenEndpoint
  • endSessionEndpoint come alias di logoutUrl
  • scopes come alias di scope

Disponibile anche:

  • additionalParameters per l'override delle richieste di auth
  • additionalTokenParameters per l'override dello scambio token
  • additionalResourceHeaders per gli header degli endpoint delle risorse
  • additionalLogoutParameters e postLogoutRedirectUrl per i flussi di logout
  • loginHint, prompt, e iosPrefersEphemeralSession

Se stai migrando da Ionic Auth Connect e vuoi mantenere gli stessi nomi provider, usa 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 provider preset supportati:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

Se un provider richiede endpoint personalizzati, puoi sovrascriverli nel preset o ignorare i preset e configurare il provider direttamente in oauth2.

OpzioneTipoObbligatorioDescrizione
appId / clientIdstringSìClient identifier OAuth2
issuerUrlstringNoURL base per l'OIDC discovery
authorizationBaseUrl / authorizationEndpointstringSì*URL dell'endpoint di autorizzazione
accessTokenEndpoint / tokenEndpointstringNo*URL dell'endpoint del token
redirectUrlstringSìURL di callback
scope / scopesstring / string[]NoScope richiesti
pkceEnabledbooleanNoPredefinito su true
responseType'code' o 'token'NoPredefinito su 'code'
resourceUrlstringNoEndpoint info utente o risorsa
logoutUrl / endSessionEndpointstringNoURL di logout o fine sessione
postLogoutRedirectUrlstringNoURL di redirect dopo il logout
additionalParametersRecord<string, string>NoParametri extra per la richiesta di auth
additionalTokenParametersRecord<string, string>NoParametri extra per la richiesta del token
additionalResourceHeadersRecord<string, string>NoHeader extra per resourceUrl
additionalLogoutParametersRecord<string, string>NoParametri extra per il logout
loginHintstringNoScorciatoia per additionalParameters.login_hint
promptstringNoScorciatoia per additionalParameters.prompt
iosPrefersEphemeralSessionbooleanNoPreferisci sessione browser effimera su iOS
logsEnabledbooleanNoAbilita il debug logging dettagliato

authorizationBaseUrl e accessTokenEndpoint sono opzionali solo quando issuerUrl è sufficiente per il discovery. Gli endpoint espliciti hanno sempre la precedenza sui valori scoperti.

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

Usa flow: 'redirect' se vuoi un redirect a pagina intera invece di un popup:

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

Nella pagina che riceve la callback, analizza il risultato del login:

const result = await SocialLogin.handleRedirectCallback();
if (result?.provider === 'oauth2') {
console.log(result.result.providerId);
}
const status = await SocialLogin.isLoggedIn({
provider: 'oauth2',
providerId: 'github',
});
await SocialLogin.logout({
provider: 'oauth2',
providerId: 'github',
});
await SocialLogin.refresh({
provider: 'oauth2',
options: {
providerId: 'github',
},
});
const refreshed = await SocialLogin.refreshToken({
provider: 'oauth2',
providerId: 'github',
refreshToken: 'existing-refresh-token',
});

refresh() utilizza il refresh token memorizzato dal plugin. refreshToken() ti permette di passare manualmente un refresh token e restituisce la nuova risposta OAuth2.

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

Usa GitHub quando desideri un semplice flusso OAuth e i dati base del profilo:

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

Usa Azure quando hai bisogno di dati da Microsoft Graph, come il profilo utente:

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 è l'ideale se hai bisogno di OIDC e di una API audience personalizzata:

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

Se usi il redirect flow sul web, leggi il risultato nella callback page:

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

Usa la discovery quando il tuo provider la pubblica /.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);

Un login OAuth2 riuscito restituisce:

CampoDescrizione
providerIdLa chiave del provider configurata per il login
accessTokenIl payload dell'access token o null
idTokenL'ID token OIDC, se restituito dal provider
refreshTokenIl refresh token, se gli scope richiesti lo consentono
resourceDataIl JSON grezzo recuperato da resourceUrl
scopeGli scope autorizzati
tokenTypeDi solito bearer
expiresInDurata del token in secondi
  1. Crea un'app OAuth Apri Impostazioni sviluppatore di GitHub e crea una nuova app OAuth.

  2. Imposta l'URL di callback Usa l'URL di redirect della tua app, ad esempio myapp://oauth/github.

  3. Configura il 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. Registra un'app Vai su Azure Portal, apri App registrations, e crea una registrazione per app nativa o mobile.

  2. Aggiungi la redirect URI Aggiungi una redirect URI mobile o desktop che corrisponda alla callback URL della tua app.

  3. Configura il 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. Crea un'applicazione nativa Apri la Dashboard di Auth0 e crea un'app Native.

  2. Imposta le callback URL consentite Aggiungi l'URL di redirect esatto usato dalla tua app Capacitor.

  3. Configura il 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. Crea un'app nativa OIDC Nella Okta Admin Console, crea un'applicazione OIDC Native.

  2. Aggiungi il tuo redirect URI Registra l'URL di callback esatto usato dalla tua app.

  3. Configura il 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',
    },
    },
    });

Se il tuo provider supporta l'OpenID Connect discovery, preferisci 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,
},
},
});

Se la discovery non è disponibile, configura manualmente gli endpoint di authorization e token.

  • Il plugin utilizza ASWebAuthenticationSession.
  • Imposta iosPrefersEphemeralSession: true se desideri una sessione browser privata senza cookie condivisi.
  • I redirect OAuth tornano tramite lo scheme e l'host della tua app.
  • Assicurati che la callback URL del provider corrisponda esattamente alla configurazione del deep link su Android.
  • Il plugin gestisce già l'attività OAuth. Aggiungi intent filter personalizzati solo se la tua app richiede un pattern di redirect diverso.
  • Il flusso popup è quello predefinito e funziona bene per le single-page app.
  • Il flusso redirect è preferibile se il provider blocca i popup o se le tue regole di auth richiedono una navigazione top-level.
  • Alcuni provider bloccano lo scambio diretto del token nel browser tramite CORS. In questi casi, usa uno scambio lato backend o una configurazione del provider che permetta client pubblici.
  1. Usa PKCE Mantieni pkceEnabled: true per i client pubblici.

  2. Preferisci il flusso di autorizzazione code responseType: 'code' è più sicuro del flusso implicit.

  3. Valida i token sul tuo backend Decodifica e verifica issuer, audience, expiration e signature lato server.

  4. Memorizza i refresh token in modo sicuro Per le app native, abbina questo plugin a @capgo/capacitor-persistent-account.

  5. Usa HTTPS ovunque Gli endpoint di auth e logout in produzione devono sempre usare HTTPS.

Ogni metodo OAuth2 richiede la chiave del provider configurata:

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

Chiama SocialLogin.initialize() prima del login e assicurati che il providerId corrisponda alla chiave dell'oggetto sotto oauth2.

Redirect URL non corrispondente

Sezione intitolata “Redirect URL mismatch”
  • Confronta la redirect URL configurata nell'app e nella dashboard del provider carattere per carattere.
  • Controlla slash finali, discrepanze nello scheme e host differenti.
  • Assicurati che gli URL scheme dell'app mobile siano registrati prima di testare sul dispositivo.

Nessun refresh token restituito

Sezione: “Nessun refresh token restituito”

La maggior parte dei provider restituisce i refresh token solo se richiedi scope come offline_access o forzi esplicitamente il consenso. Controlla la policy specifica del provider.

Abilita logsEnabled: true sulla configurazione del provider per ispezionare gli URL generati e i dettagli del token exchange.

Se stai usando Provider OAuth2 generici per pianificare i flussi di autenticazione e account, collegandolo a Utilizzo di @capgo/capacitor-social-login per la funzionalità nativa in Utilizzo di @capgo/capacitor-social-login, @capgo/capacitor-social-login per i dettagli di implementazione in @capgo/capacitor-social-login, @capgo/capacitor-passkey per i dettagli di implementazione in @capgo/capacitor-passkey, @capgo/capacitor-native-biometric per i dettagli di implementazione in @capgo/capacitor-native-biometric, e Autenticazione a due fattori per i dettagli sull'implementazione dell'autenticazione a due fattori.