Saltare al contenuto

Provider OAuth2 generici

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

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

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

Prima di configurare un provider, raccogli:

  • Il tuo ID del 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 code del flusso, o un issuerUrl per la scoperta OIDC
  • Gli ambiti che il tuo app necessita, come openid profile email

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

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 come alias di appId
  • authorizationEndpoint come alias di authorizationBaseUrl
  • tokenEndpoint come alias di accessTokenEndpoint
  • endSessionEndpoint come alias di logoutUrl
  • scopes Disponibile anche: scope

per override delle richieste di autenticazione

  • additionalParameters per override degli scambi di token
  • additionalTokenParameters per intestazioni personalizzate degli endpoint di risorsa
  • additionalResourceHeaders e
  • additionalLogoutParameters per flussi di logout postLogoutRedirectUrl __CAPGO_KEEP_0__
  • loginHint, promptEcco le impostazioni compatibili con Auth Connect iosPrefersEphemeralSession

Sottosezione intitolata “Impostazioni compatibili con Auth Connect”

Se stai migrando da Ionic Auth Connect e desideri mantenere gli stessi nomi dei provider, utilizza

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

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

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

Opzioni di configurazione oauth2.

Sottosezione intitolata “Opzioni di configurazione”

Opzione
TipoRichiestoEcco le impostazioni, eDescrizione
appId / clientId__CAPGO_KEEP_0__Identificatore del client OAuth2
issuerUrl__CAPGO_KEEP_0__NoURL di base per la scoperta OIDC
authorizationBaseUrl / authorizationEndpoint__CAPGO_KEEP_0__Sì*URL del endpoint di autorizzazione
accessTokenEndpoint / tokenEndpoint__CAPGO_KEEP_0__No*URL del endpoint del token
redirectUrlstringURL di callback
scope / scopesstring / string[]NoScopi richiesti
pkceEnabledbooleanNoPredefinito a true
responseType'code' o 'token'NoPredefinito a 'code'
resourceUrl__CAPGO_KEEP_0__NoInformazioni dell'utente o endpoint dei risorse
logoutUrl / endSessionEndpoint__CAPGO_KEEP_0__NoURL di logout o fine sessione
postLogoutRedirectUrl__CAPGO_KEEP_0__NoURL di reindirizzamento dopo il logout
additionalParametersRecord<string, string>NoParametri di richiesta di autenticazione aggiuntivi
additionalTokenParametersRecord<string, string>NoParametri aggiuntivi per richiesta token
additionalResourceHeadersRecord<string, string>NoTesto aggiuntivo per intestazioni resourceUrl
additionalLogoutParametersRecord<string, string>NoParametri aggiuntivi per logout
loginHintstringaNoAttenzione: scorciatoia per additionalParameters.login_hint
promptstringaNoAttenzione: scorciatoia per additionalParameters.prompt
iosPrefersEphemeralSessionbooleanNoPrefer sessione del browser temporanea su iOS
logsEnabledbooleanNoAbilita logging di debug verboso

authorizationBaseUrl e sono facoltativi solo quando accessTokenEndpoint è sufficiente per la scoperta. I endpoint espliciti sempre hanno la precedenza sui valori scoperti. issuerUrl Utilizzo del login OAuth2

Sezione intitolata “Utilizzo del login OAuth2”

Login
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 a schermo intero al posto di un popup:

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

Nella pagina che riceve il callback, analizza il risultato dell'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 autenticazione 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 di 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 è una buona scelta quando hai bisogno di OIDC più un pubblico personalizzato 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',
},
});

Se utilizzi il flusso di reindirizzamento sul web, leggi il risultato nuovamente 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
idTokenToken ID OIDC se il provider ne ha restituito uno
refreshTokenToken di refresh se i permessi richiesti lo consentivano
resourceDataJSON raw recuperato da resourceUrl
scopeScopi concesso
tokenTypeDi solito bearer
expiresInDurata del token in secondi
  1. Crea 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 un registro 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 dell'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 Apri il Dashboard Auth0 e crea un'applicazione nativa.

  2. Imposta gli URL di callback consentiti Aggiungi l'URL di reindirizzamento esatto utilizzato dalla tua 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 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.

  • The plugin utilizza ASWebAuthenticationSession.
  • Set iosPrefersEphemeralSession: true Se desideri una sessione del browser privata senza cookie condivisi.
  • Il ritorno degli indirizzi OAuth avviene 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 a popup è il default e funziona bene per gli app web a pagina singola.
  • Il flusso di redirect è meglio quando il provider blocca i popup o le tue regole di autenticazione richiedono la navigazione a livello di finestra.
  • Some provider bloccano l'intercambio diretto di token con CORS. In questi casi, utilizzare un intercambio backend o una configurazione del provider che consente ai clienti pubblici.
  1. Usa PKCE Tieni pkceEnabled: true per i clienti pubblici.

  2. La preferenza dell'accesso code è più sicura rispetto al flusso implicito. responseType: 'code' Verifica i token sul tuo backend

  3. Decodifica e verifica l'emittente, l'audience, la scadenza e la firma server-side. Memorizza i token di refresh in modo sicuro

  4. Per le app native, associa questo plugin con Capacitor @capgo/capacitor-account persistente.

  5. Usa HTTPS ovunque Gli 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' },
});

Chiamata SocialLogin.initialize() prima dell'accesso e assicurati che 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.
  • Tieni d'occhio gli slash finali, le disallineazioni di schema e gli host diversi.
  • Assicurati che gli schemi di URL delle app mobili siano registrati prima di testare sul dispositivo.

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

Abilita logsEnabled: true sulla configurazione del provider per esaminare gli URL generati e i dettagli di scambio di token.