Saltare al contenuto

Provideri OAuth2 Generici

GitHub

Il plugin di accesso sociale Capgo include un motore integrato OAuth2 e OpenID Connect. Puoi utilizzarlo per connetterti a qualsiasi provider di identità basato su standard, tra cui:

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

La oauth2 La configurazione è multi-provider di progetto. Puoi registrare diversi provider contemporaneamente e poi selezionarne uno al momento del login con providerId.

Prima di configurare un provider, raccogli:

  • Il tuo ID client OAuth
  • Un URL di reindirizzamento che corrisponde allo schema del tuo app o all'URL di callback web
  • Un endpoint di autorizzazione
  • Un endpoint di token per l'autorizzazione del flusso code o un issuerUrl per la scoperta OIDC
  • Gli ambiti che il tuo app necessita, come openid profile email

Usa SocialLogin.initialize() una sola volta durante l'avvio dell'app e registra ogni provider che hai bisogno:

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 scoperta 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 gli alias OAuth e OIDC comuni:

  • clientId Section titled “Configurazione dei provider multipli” appId
  • authorizationEndpoint Section titled “Configurazione dei provider multipli” authorizationBaseUrl
  • tokenEndpoint come alias di accessTokenEndpoint
  • endSessionEndpoint come alias di logoutUrl
  • scopes come alias di scope

Disponibile anche:

  • additionalParameters per override delle richieste di autenticazione
  • additionalTokenParameters per override degli scambi di token
  • additionalResourceHeaders per endpoint di risorsa personalizzati
  • additionalLogoutParameters e postLogoutRedirectUrl per flussi di logout
  • loginHint, prompt, e iosPrefersEphemeralSession

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

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

Se un provider richiede endpoint personalizzati, si possono sovrascriverli nel preset o saltare i preset e configurare il provider direttamente in oauth2.

OpzioneTipoRispostaRisposta
appId / clientIdRispostaSìIdentificatore del client OAuth2
issuerUrlstringaNoURL di base di OIDC discovery
authorizationBaseUrl / authorizationEndpointstringaSì*URL del endpoint di autorizzazione
accessTokenEndpoint / tokenEndpointstringaNo*URL del endpoint di token
redirectUrlstringaSìURL di callback
scope / scopesstring / string[]NoScopi richiesti
pkceEnabledbooleanNoPredefinito a true
responseType'code' o 'token'NoPredefinito a 'code'
resourceUrlstringNoInformazioni utente o endpoint risorsa
logoutUrl / endSessionEndpointstringaNoURL di logout o fine sessione
postLogoutRedirectUrlstringaNoURL di reindirizzamento dopo logout
additionalParametersRecord<string, string>NoParametri di richiesta di autenticazione aggiuntivi
additionalTokenParametersRecord<string, string>NoParametri di richiesta di token aggiuntivi
additionalResourceHeadersRecord<string, string>NoAggiunti intestazioni per resourceUrl
additionalLogoutParametersRecord<string, string>NoAggiunti parametri di logout aggiuntivi
loginHintstringaNoAttenzione: questo campo è obbligatorio additionalParameters.login_hint
promptstringaNoAttenzione: questo campo è obbligatorio additionalParameters.prompt
iosPrefersEphemeralSessionbooleanoNoPreferisci una sessione del browser temporanea su iOS
logsEnabledbooleanNoAbilita logging di debug verboso

authorizationBaseUrl e accessTokenEndpoint sono facoltativi solo quando issuerUrl è sufficiente per la scoperta. Gli endpoint espliciti sempre vincono sui valori scoperti.

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

Flusso di reindirizzamento sul web

Flusso di reindirizzamento su web

Usa flow: 'redirect' se desideri un reindirizzamento a pagina intera al posto di un popup:

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

Sulla pagina che riceve il callback, analizza il risultato di accesso:

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

Stato di accesso e disconnessione

Flusso di reindirizzamento su web
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 token di rinfresco memorizzato dal plugin. refreshToken() ti consente di passare un token di refresh da te e restituisce la risposta OAuth2 fresca.

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

Usa GitHub quando desideri un flusso di app OAuth semplice e dati di profilo base:

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 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 is a good fit when you need OIDC plus a custom API audience:

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 utilizzi il flusso di reindirizzamento sul web, leggi il risultato sulla pagina di callback:

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 scoperta quando il tuo provider 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);

I login OAuth2 riusciti restituiscono:

CampoDescrizione
providerIdLa chiave del provider configurata utilizzata per l'accesso
accessTokenPayload del token di accesso o null
idTokenToken ID OIDC se il provider ne ha restituito uno
refreshTokenRinnova il token se i permessi richiesti lo consentivano
resourceDataJSON raw recuperato da resourceUrl
scopeScopi concesso
tokenTypeSolitamente bearer
expiresInDurata del token in secondi

Riferimento alla configurazione del provider

Riferimento di configurazione del provider
  1. Crea un'app OAuth Apre GitHub Impostazioni dello sviluppatore e crea un nuovo App OAuth.

  2. Imposta l'URL di callback Usa l'URL di reindirizzamento del tuo 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 al Portale Azure, apri App registrationse crea una registrazione di app nativa o mobile.

  2. Aggiungi l'URI di reindirizzamento Aggiungi un URI di reindirizzamento mobile o desktop che corrisponde all'URL di callback del tuo 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. Creare un'applicazione nativa Apre il Pannello di controllo Auth0 e crea un'applicazione nativa.

  2. Configura gli URL di callback consentiti Aggiungi l'URL di reindirizzamento esatto utilizzato dal tuo Capacitor app.

  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'applicazione nativa OIDC In Console di amministrazione Okta, crea un'applicazione nativa OIDC.

  2. Aggiungi il tuo URI di reindirizzamento Registra l'URL di callback esatto utilizzato dal tuo 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 la scoperta di OpenID Connect, 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 scoperta non è disponibile, configura manualmente gli endpoint di autorizzazione e token.

  • Il plugin utilizza ASWebAuthenticationSession.
  • Imposta iosPrefersEphemeralSession: true Se vuoi una sessione di navigazione privata senza cookie condivisi.
  • Il flusso OAuth ritorna attraverso il tuo schema e l'host dell'applicazione.
  • Make sure the provider callback URL exactly matches your Android deep link setup.
  • Il plugin gestisce già l'attività OAuth. Aggiungi solo filtri di intento personalizzati se il tuo app richiede un diverso modello di reindirizzamento.
  • Il flusso popup è il default e funziona bene per gli app monopagina.
  • Il flusso redirect è meglio quando il provider blocca i popup o le tue regole di autenticazione richiedono la navigazione a livello di host.
  • Alcuni provider bloccano l'accesso diretto al token del browser tramite CORS. In questi casi, utilizzare un'intercetta di backend o una configurazione del provider che consenta ai clienti pubblici.

Pratiche di sicurezza migliori

Sottotitolo: "Pratiche di sicurezza migliori"
  1. Usa PKCE Tieni pkceEnabled: true per i clienti pubblici.

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

  3. Valida i token sul tuo backend Decodifica e verifica l'emittente, l'audience, la scadenza e la firma server-side.

  4. Rifresca i token di accesso in modo sicuro Per le app native, associa questo plugin con @capgo/capacitor-account-persistente.

  5. Usa HTTPS ovunque I punti di accesso di autenticazione e di logout nella produzione dovrebbero sempre utilizzare HTTPS.

Tutti i metodi OAuth2 richiedono la chiave del provider configurata:

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

Chiamata SocialLogin.initialize() prima dell'accesso e assicurati che il providerId corrisponda alla chiave dell'oggetto sotto oauth2.

  • Confronta l'URL di reindirizzamento configurato nel tuo app e nel pannello provider carattere per carattero.
  • Attenti a eventuali slash finali, disaccordi di schema e host diversi.
  • Assicurati di registrare i schemi di URL dell'app mobile prima di testare sul dispositivo.

La maggior parte dei provider restituisce solo i token di refresh quando richiedi ambiti come offline_access o esplicitamente forza il consenso. Recensisci la politica specifica del provider.

Abilita logsEnabled: true per visualizzare le URL generati e i dettagli dell'interscambio di token nella configurazione del provider.

Se stai utilizzando Provider OAuth2 Generici per pianificare l'autenticazione e le flussi di account, connettilo con Utilizza @capgo/capacitor-social-login per la capacità nativa in Utilizza @capgo/capacitor-social-login, @capgo/capacitor-login con accesso sociale per il dettaglio di implementazione in @capgo/capacitor-social-login, @capgo/capacitor-chiave di accesso per i dettagli di implementazione in @capgo/capacitor-passkey, @capgo/capacitor-autenticazione-biometrica-nativa per i dettagli di implementazione in @capgo/capacitor-native-biometric, e Autenticazione a due fattori per i dettagli di implementazione in Autenticazione a due fattori.