跳过内容

Generic OAuth2 Providers

GitHub

Capgo 社会登录插件内置了 OAuth2 和 OpenID Connect 引擎。您可以使用它连接任何基于标准的身份提供者,包括:

  • GitHub
  • Azure AD / Microsoft Entra ID
  • Auth0
  • Okta
  • Keycloak
  • 自定义 OAuth2 或 OIDC 服务器

The configuration is multi-provider by design. You can register several providers at once and then select one at login time with oauth2 What you need providerId.

在配置提供者之前,请收集以下信息:

Your OAuth client ID

一个与您的应用程序方案或 Web 回调 URL 匹配的重定向 URL

  • 授权终点
  • 授权流程中的令牌终点,或者一个 OIDC 发现终点
  • 您的应用程序需要的范围,例如
  • A token endpoint for authorization code flow, or an issuerUrl for OIDC discovery
  • An authorization endpoint openid profile email

A token endpoint for authorization __CAPGO_KEEP_0__ flow, or an

Section titled “多提供商配置”

Use SocialLogin.initialize() 一次在应用启动时注册所需的每个提供商:

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

如果您的提供商公开了一个OpenID Connect发现文档,则 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,
},
},
});

该插件还支持常见的OAuth和OIDC别名:

  • clientId 作为别名 appId
  • authorizationEndpoint 作为别名 authorizationBaseUrl
  • tokenEndpoint 作为 accessTokenEndpoint
  • endSessionEndpoint 作为 logoutUrl
  • scopes 作为 scope

也可用:

  • additionalParameters 用于认证请求覆盖
  • additionalTokenParameters 用于令牌交换覆盖
  • additionalResourceHeaders 用于自定义资源端点头
  • additionalLogoutParameterspostLogoutRedirectUrl 用于注销流程
  • loginHint, promptiosPrefersEphemeralSession

Auth Connect 兼容的预设

标题:Auth Connect 兼容的预设

If you are migrating from Ionic Auth Connect and want to keep the same provider names, use 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:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

If a provider needs custom endpoints, either override them in the preset or bypass presets and configure the provider directly in oauth2.

配置选项

配置选项
选项类型是否必填描述
appId / clientId字符串OAuth2 客户端标识符
issuerUrlstringOIDC 发现基址 URL
authorizationBaseUrl / authorizationEndpointstring是*授权端点 URL
accessTokenEndpoint / tokenEndpointstring否*令牌端点 URL
redirectUrlstring回调 URL
scope / scopesstring / string[]请求的权限
pkceEnabledboolean默认值 true
responseType'code''token'默认值 'code'
resourceUrlstring用户信息或资源端点
logoutUrl / endSessionEndpoint__CAPGO_KEEP_0__注销或结束会话URL
postLogoutRedirectUrl__CAPGO_KEEP_0__注销后重定向URL
additionalParametersRecord<string, string>__CAPGO_KEEP_0__额外的认证请求参数
additionalTokenParametersRecord<string, string>__CAPGO_KEEP_0__额外的令牌请求参数
additionalResourceHeadersRecord<string, string>__CAPGO_KEEP_0__Extra headers for resourceUrl
additionalLogoutParametersRecord<string, string>NoExtra logout params
loginHintstringNoShortcut for additionalParameters.login_hint
promptstringNoShortcut for additionalParameters.prompt
iosPrefersEphemeralSessionbooleanNoPrefer iOS iOS临时会话
logsEnabledboolean启用详细调试日志

authorizationBaseUrl 并且 accessTokenEndpoint 只有当 issuerUrl 仅仅是足够的发现。显式端点始终优先于发现的值。

使用 OAuth2 登录

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

在 Web 上重定向流

web端重定向流程

Use flow: 'redirect' 如果您想要全屏重定向而不是弹出窗口:

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

在接收回调的页面解析登录结果:

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() 使用插件存储的刷新令牌。 refreshToken() 让您传递一个刷新令牌并返回新的 OAuth2 响应。

获取当前访问令牌

获取当前访问令牌
const code = await SocialLogin.getAuthorizationCode({
provider: 'oauth2',
providerId: 'github',
});
console.log(code.accessToken);

提供商特定的示例

示例:__CAPGO_KEEP_0__

Use GitHub when you want a simple OAuth app flow and basic profile data:

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

当您需要 Microsoft Graph 数据,如用户资料时,请使用 Azure:

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 示例

Auth0 示例

Auth0 适合需要 OIDC 加自定义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',
},
});

如果在 Web 上使用重定向流,请在回调页面上读取结果:

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

Okta 示例

Okta 示例
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);

Keycloak 示例

Keycloak 示例

当提供者发布时,请使用发现 /.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);

OAuth2 响应形状

OAuth2 响应形状

成功的 OAuth2 登录返回:

字段描述
providerId用于登录的配置提供者密钥
accessToken访问令牌负载或 null
idTokenOIDC ID 令牌,如果提供者返回一个
refreshToken如果请求的权限范围允许则刷新令牌
resourceData从原始 JSON 中获取 resourceUrl
scope已授权的权限范围
tokenType通常 bearer
expiresIn令牌有效期(秒)

提供者设置参考

提供者设置参考

GitHub

GitHub
  1. 创建 OAuth 应用 打开 GitHub 开发者设置 并创建一个新的 OAuth 应用。

  2. 设置回调 URL 使用您的应用重定向 URL,例如 myapp://oauth/github.

  3. 配置插件

    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 AD / Microsoft Entra ID

Azure AD / Microsoft Entra ID 部分
  1. 注册应用 转到 Azure 门户,打开 App registrations并创建一个本机或移动应用注册。

  2. 添加重定向 URI 添加一个匹配您的应用回调 URL 的移动或桌面重定向 URI。

  3. 配置插件

    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. 创建本机应用 打开 Auth0 控制台 并创建一个本机应用。

  2. 设置允许的回调 URL 添加您的 Capacitor 应用程序使用的exact重定向 URL。

  3. 配置插件

    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. 创建 OIDC 原生应用 在 Okta 管理控制台中,创建 OIDC 原生应用程序。

  2. 添加您的重定向 URI 将您的应用程序使用的exact回调 URL注册。

  3. 配置插件

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

Keycloak 和自定义 OIDC 提供商

Keycloak 和自定义 OIDC 提供商部分

如果您的提供商支持 OpenID Connect 发现,优先 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,
},
},
});

如果发现不可用,请手动配置授权和令牌端点。

平台特定说明

平台特定说明部分
  • 插件使用 ASWebAuthenticationSession.
  • 设置 iosPrefersEphemeralSession: true 如果您想要一个私有的浏览器会话,没有共享的 cookie。

Android

Android
  • 通过您的应用程序方案和主机,OAuth 重定向返回。
  • 确保提供商回调 URL 与您的 Android 深度链接设置完全匹配。
  • 该插件已经处理了 OAuth 活动。只有在您的应用程序需要不同的重定向模式时才添加自定义意图过滤器。

Web

Web
  • 弹出式流程是默认的,适用于单页应用程序。
  • 重定向流程在提供商阻止弹出窗口或您的认证规则需要顶级导航时更好。
  • 某些提供商阻止直接浏览器令牌交换,使用 CORS。 在这种情况下,请使用后端交换或允许公共客户端的提供商设置。

安全最佳实践

安全最佳实践
  1. 使用 PKCE 保留 pkceEnabled: true 用于公共客户端。

  2. 优先使用 code 流 responseType: 'code' 比隐式流更安全。

  3. 在后端验证令牌 在服务器端解码和验证发行者、受众、过期时间和签名

  4. 安全存储刷新令牌 对于原生应用程序,请将此插件与 @capgo/capacitor-persistent-account.

  5. 使用 HTTPS 生产认证端点和注销端点始终应使用 HTTPS。

故障排除

故障排除

每个 OAuth2 方法都需要配置的提供者密钥:

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

Call SocialLogin.initialize() 在登录之前确保 providerIdoauth2.

  • 将您的应用程序和提供商控制台中配置的重定向 URL 字符逐一比较。
  • 注意URL末尾是否有斜杠、方案不匹配以及主机不同。
  • 确保在设备上测试前,已注册移动应用程序URL方案。

未返回刷新令牌

标题:未返回刷新令牌

大多数提供商只在您请求的范围(如“openid”或“profile”)或明确要求同意时才会返回刷新令牌。请查看提供商的具体政策。 offline_access 令牌交换调试

标题:令牌交换调试

启用

在提供商配置中启用以检查生成的URL和令牌交换详细信息。 logsEnabled: true 相关文档

__CAPGO_KEEP_0__

继续使用通用OAuth2提供者

继续使用通用OAuth2提供者

如果您正在使用 通用OAuth2提供者 来规划身份验证和帐户流程,连接它 使用@capgo/capacitor-social-login 为@capgo/capacitor-social-login中的本机功能 使用@capgo/capacitor-social-login 为@capgo/capacitor-social-login中的实现细节 使用@capgo/capacitor-passkey for the implementation detail in @capgo/capacitor-passkey, @capgo/capacitor-native-biometric for the implementation detail in @capgo/capacitor-native-biometric, and Two-factor authentication for the implementation detail in Two-factor authentication.