Saltare al contenuto

Provider OAuth2 Generici

GitHub

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

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

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

Prima di configurare un provider, raccogli:

  • ID del tuo client OAuth
  • Un URL di reindirizzamento che corrisponde allo schema del tuo app o all'URL di callback web
  • Punto di accesso all'autorizzazione
  • Punto di autorizzazione per il flusso di autorizzazione code o un punto di scoperta OIDC issuerUrl Cosa ti serve
  • Le autorizzazioni che il tuo app richiede, ad esempio 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 OIDC e OAuth comuni:

  • 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

Inoltre disponibile:

  • additionalParameters per override delle richieste di autenticazione
  • additionalTokenParameters per override degli scambi di token
  • additionalResourceHeaders per intestazioni personalizzate degli endpoint di risorsa
  • additionalLogoutParameters e postLogoutRedirectUrl per flussi di logout
  • loginHint, prompte 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',
},
},
});

Ilenco degli ID dei provider supportati:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

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

OpzioneTipoRichiestoDescrizione
appId / clientIdIdentificatore del client OAuth2SìIdentificatore del client OAuth2
issuerUrlstringaNoURL di base per la scoperta OIDC
authorizationBaseUrl / authorizationEndpointstringaSì*URL del endpoint di autorizzazione
accessTokenEndpoint / tokenEndpointstringaNo*URL del endpoint del token
redirectUrlstringSìURL di callback
scope / scopesstring / string[]NoScopi richiesti
pkceEnabledbooleanNoPredefinito a true
responseType'code' o 'token'NoPredefinito a 'code'
resourceUrlInformazioni utente o endpoint risorsaNoEndpoint per l'accesso OAuth2
logoutUrl / endSessionEndpointstringNoURL di logout o fine sessione
postLogoutRedirectUrlstringNoURL di reindirizzamento dopo logout
additionalParametersRecord<string, string>stringNo
additionalTokenParametersRecord<string, string>Parametri aggiuntivi per la richiesta di autenticazioneParametri aggiuntivi per richieste di token
additionalResourceHeadersRecord<string, string>NoIntestazioni aggiuntive per resourceUrl
additionalLogoutParametersRecord<string, string>NoParametri aggiuntivi per logout
loginHintstringaNoAttenzione per additionalParameters.login_hint
promptstringaNoAttenzione per additionalParameters.prompt
iosPrefersEphemeralSessionbooleanoNoPrefer sessione di browser temporanea su iOS
logsEnabledbooleanNoAbilita registrazione dei log di debug dettagliati

authorizationBaseUrl e accessTokenEndpoint sono facoltativi solo quando issuerUrl è sufficiente per la scoperta. I punti finali espliciti sempre prevalgono 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 desideri un reindirizzamento di pagina completa 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);
}
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 rinnovo memorizzato dal plugin. refreshToken() ti consente di passare un token di rinnovo da te e di restituire 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);

Utilizza Azure quando hai bisogno di dati del 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);

Utilizza 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 dell'accesso token o null
idTokenID token OIDC se il provider ne ha restituito uno
refreshTokenToken di rinfresco se i permessi richiesti glielo hanno consentito
resourceDataJSON raw recuperato da resourceUrl
scopeScopi concesi
tokenTypeDi solito bearer
expiresInDurata del token in secondi
  1. Creare un'app OAuth Apri GitHub Impostazioni dello sviluppatore e crea una nuova app OAuth.

  2. Imposta l'URL di callback Utilizza 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 per dispositivi mobili o desktop che corrisponde all'URL di callback del tuo'applicazione.

  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 Apre il Dashboard Auth0 e crea un'app nativa.

  2. Configura gli URL di callback consentiti Aggiungi l'URL di reindirizzamento esatto utilizzato 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'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 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 la scoperta 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.
  • Configura iosPrefersEphemeralSession: true Se desideri una sessione del browser privata senza cookie condivisi.
  • Il redirect OAuth torna attraverso il tuo schema e host dell'applicazione.
  • Assicurati che l'URL di callback del provider corrisponda esattamente alla configurazione del collegamento profondo Android.
  • Il plugin gestisce già l'attività OAuth. Aggiungi solo filtri di intento personalizzati se la tua app richiede un diverso modello di redirect.
  • Il flusso popup è il default e funziona bene per le app a pagina singola.
  • Il flusso redirect è meglio quando il provider blocca i popup o le tue regole di autenticazione richiedono la navigazione a livello di finestra.
  • Alcuni provider bloccano l'acquisizione diretta del token del browser con CORS. In questi casi, utilizza un'acquisizione di backend o una configurazione del provider che consenta ai clienti pubblici.
  1. Usa PKCE Conserva pkceEnabled: true per i clienti pubblici.

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

  3. Verifica i token sul tuo backend Decodifica e verifica l'emittente, l'utenza, la scadenza e la firma sul server.

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

  5. Usa HTTPS in ogni momento Le endpoint di autenticazione e di logout in produzione dovrebbero sempre utilizzare HTTPS.

Ogni metodo OAuth2 richiede la chiave del provider configurata:

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

Chiamare 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 di controllo del provider carattere per carattero.
  • Controlla per eventuali slash finali, disaccordi di schema e host diversi.
  • Assicurati di registrare i schemi di URL delle app mobili prima di testare sul dispositivo.

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

Abilita logsEnabled: true su la configurazione del provider per esaminare gli URL generati e i dettagli dell'interscambio di token.

Se stai utilizzando Generic OAuth2 Providers 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-social-login per i dettagli di implementazione in @capgo/capacitor-login-social @capgo/capacitor-chiave-pass per i dettagli di implementazione in @capgo/capacitor-chiave-pass @capgo/capacitor-biometria-nativa per i dettagli di implementazione in @capgo/capacitor-biometria-nativa, e Autenticazione a due fattori per i dettagli di implementazione in Autenticazione a due fattori.