Saltar al contenido

Proveedores OAuth2 genéricos

GitHub

El plugin Social Login de Capgo incluye un motor integrado de OAuth2 y OpenID Connect. Puedes usarlo para conectar cualquier proveedor de identidad basado en estándares, como:

  • GitHub
  • Azure AD / Microsoft Entra ID
  • Auth0
  • Okta
  • Keycloak
  • Servidores OAuth2 u OIDC personalizados

El oauth2 la configuración es multi-proveedor por diseño. Puedes registrar varios proveedores a la vez y luego seleccionar uno al iniciar sesión con providerId.

Antes de configurar un proveedor, obtén:

  • Tu OAuth client ID
  • Una URL de redirección que coincida con el scheme de tu app o la URL de callback web
  • Un endpoint de autorización
  • Un endpoint de token para el flujo de autorización code, o uno issuerUrl para el descubrimiento de OIDC
  • Los scopes que necesite tu app, como openid profile email

Usa SocialLogin.initialize() una vez al iniciar la app y registra cada proveedor que necesites:

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

Si tu proveedor expone un documento de descubrimiento de OpenID Connect, issuerUrl es la configuración más sencilla:

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

El plugin también admite alias comunes de OAuth y OIDC:

  • clientId como un alias de appId
  • authorizationEndpoint como un alias de authorizationBaseUrl
  • tokenEndpoint como un alias de accessTokenEndpoint
  • endSessionEndpoint como un alias de logoutUrl
  • scopes como un alias de scope

También disponible:

  • additionalParameters para overrides de peticiones de auth
  • additionalTokenParameters para overrides de intercambio de tokens
  • additionalResourceHeaders para headers de endpoints de recursos personalizados
  • additionalLogoutParameters y postLogoutRedirectUrl para flujos de logout
  • loginHint, prompt, y iosPrefersEphemeralSession

Si estás migrando desde Ionic Auth Connect y quieres mantener los mismos nombres de 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',
},
},
});

IDs de presets de providers soportados:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

Si un proveedor requiere endpoints personalizados, puedes sobrescribirlos en el preset o saltarte los presets y configurar el proveedor directamente en oauth2.

OpciónTipoObligatorioDescripción
appId / clientIdstringSíIdentificador de cliente OAuth2
issuerUrlstringNoURL base de descubrimiento OIDC
authorizationBaseUrl / authorizationEndpointstringSí*URL del endpoint de autorización
accessTokenEndpoint / tokenEndpointstringNo*URL del endpoint de token
redirectUrlstringSíURL de callback
scope / scopesstring / string[]NoScopes solicitados
pkceEnabledbooleanoNoPor defecto true
responseType'code' o 'token'NoPor defecto 'code'
resourceUrlstringNoEndpoint de recursos o info de usuario
logoutUrl / endSessionEndpointstringNoURL de logout o fin de sesión
postLogoutRedirectUrlstringNoURL de redirección tras logout
additionalParametersRecord<string, string>NoParámetros extra de la petición de auth
additionalTokenParametersRecord<string, string>NoParámetros extra de la petición de token
additionalResourceHeadersRecord<string, string>NoHeaders extra para resourceUrl
additionalLogoutParametersRecord<string, string>NoParámetros extra de logout
loginHintstringNoAtajo para additionalParameters.login_hint
promptstringNoAtajo para additionalParameters.prompt
iosPrefersEphemeralSessionbooleanoNoPreferir sesión de navegador efímera en iOS
logsEnabledbooleanoNoActivar logs de depuración detallados

authorizationBaseUrl y accessTokenEndpoint solo son opcionales cuando issuerUrl es suficiente para el descubrimiento. Los endpoints explícitos siempre tienen prioridad sobre los descubiertos.

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

Usa flow: 'redirect' si quieres una redirección a página completa en lugar de un popup:

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

En la página que recibe el callback, parsea el resultado 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() usa el refresh token almacenado por el plugin. refreshToken() te permite pasar un refresh token manualmente y devuelve la respuesta OAuth2 actualizada.

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

Usa GitHub cuando busques un flujo de OAuth sencillo y datos de perfil básicos:

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 cuando necesites datos de Microsoft Graph, como el perfil de usuario:

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 es ideal cuando necesitas OIDC junto con un API audience personalizado:

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

Si usas el flujo de redirección en web, lee el resultado en la página de 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 discovery cuando tu proveedor publique /.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);

Los inicios de sesión OAuth2 exitosos devuelven:

CampoDescripción
providerIdLa clave del proveedor configurada para el login
accessTokenEl payload del access token o null
idTokenEl ID token de OIDC si el proveedor lo devolvió
refreshTokenEl refresh token si los scopes permitieron solicitarlo
resourceDataEl JSON bruto obtenido de resourceUrl
scopeLos scopes concedidos
tokenTypeNormalmente bearer
expiresInDuración del token en segundos
  1. Crea una app OAuth Abrir Configuración de desarrollador de GitHub y crea una nueva app OAuth.

  2. Configura la URL de callback Usa la URL de redirección de tu app, por ejemplo myapp://oauth/github.

  3. Configura el 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. Registrar una app Ve al portal de Azure y abre App registrations, y crea un registro de app nativa o móvil.

  2. Añadir la URI de redirección Añade una URI de redirección móvil o de escritorio que coincida con la URL de callback de tu app.

  3. Configura el 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 una aplicación nativa Abre la Dashboard de Auth0 y crea una app Native.

  2. Configura las callback URLs permitidas Añade la redirect URL exacta que usa tu app Capacitor.

  3. Configura el 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 una app nativa OIDC En la Admin Console de Okta, crea una Native Application OIDC.

  2. Añade tu URI de redirección Registra la URL de callback exacta que usa tu app.

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

Si tu proveedor soporta OpenID Connect discovery, es preferible 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,
},
},
});

Si el discovery no está disponible, configura manualmente los endpoints de autorización y de token.

  • El plugin usa ASWebAuthenticationSession.
  • Configurar iosPrefersEphemeralSession: true si quieres una sesión de navegador privada sin cookies compartidas.
  • Los redirects de OAuth vuelven por scheme y host de tu app.
  • Asegúrate de que la URL de callback del proveedor coincida exactamente con tu configuración de deep link en Android.
  • El plugin ya gestiona la actividad de OAuth. Solo añade intent filters personalizados si tu app requiere un patrón de redirección distinto.
  • El flujo de popup es el predeterminado y funciona bien para single-page apps.
  • El flujo de redirect es mejor cuando el proveedor bloquea popups o tus reglas de auth requieren navegación de nivel superior.
  • Algunos proveedores bloquean el intercambio de tokens directo en el navegador por CORS. En esos casos, usa un intercambio en el backend o una configuración de proveedor que permita clientes públicos.
  1. Usa PKCE Mantén pkceEnabled: true para clientes públicos.

  2. Prefiere el flujo de autorización code responseType: 'code' es más seguro que el flujo implícito.

  3. Valida los tokens en tu backend Decodifica y verifica el issuer, audience, expiration y la firma en el servidor.

  4. Almacena los refresh tokens de forma segura Para apps nativas, combina este plugin con @capgo/capacitor-persistent-account.

  5. Usa HTTPS en todas partes Los endpoints de auth y logout en producción siempre deben usar HTTPS.

Cada método OAuth2 requiere la clave del proveedor configurada:

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

Llama a SocialLogin.initialize() antes del login y asegúrate de que el providerId coincida con la clave del objeto en oauth2.

  • Compara la redirect URL configurada en tu app y en el dashboard del proveedor carácter por carácter.
  • Presta atención a las barras finales, discrepancias en el scheme y diferentes hosts.
  • Asegúrate de registrar los URL schemes de la app móvil antes de probar en un dispositivo.

La mayoría de los proveedores solo devuelven refresh tokens cuando solicitas scopes como offline_access o fuerzas el consentimiento explícitamente. Revisa la política de cada proveedor.

Activar logsEnabled: true en la configuración del proveedor para inspeccionar las URLs generadas y los detalles del intercambio de tokens.

Si estás usando Proveedores OAuth2 genéricos para planificar los flujos de autenticación y de cuenta, conéctalo con Uso de @capgo/capacitor-social-login para la capacidad nativa en el uso de @capgo/capacitor-social-login, @capgo/capacitor-social-login para los detalles de implementación en @capgo/capacitor-social-login, @capgo/capacitor-passkey para el detalle de implementación en @capgo/capacitor-passkey, @capgo/capacitor-native-biometric para el detalle de implementación en @capgo/capacitor-native-biometric, y Autenticación de dos factores para el detalle de implementación en la autenticación de dos factores.