跳过内容

通用 OAuth2 服务商

GitHub

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

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

The oauth2 配置是多供应商设计的。您可以一次注册多个供应商,然后在登录时选择一个。 providerId.

在配置供应商之前,请收集:

  • 您的 OAuth 客户端 ID
  • 与您的应用程序方案或 Web 回调 URL 匹配的重定向 URL
  • 授权终端
  • A token endpoint for authorization code flow, or an issuerUrl 您的应用程序需要的范围,例如
  • 多供应商配置 openid profile email

使用 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 用于 auth 请求重写
  • additionalTokenParameters 用于 token 交换重写
  • additionalResourceHeaders 用于自定义资源端点头
  • additionalLogoutParameterspostLogoutRedirectUrl 用于注销流程
  • loginHint, prompt, 和 iosPrefersEphemeralSession

Auth Connect 兼容的预设

标题:Auth Connect 兼容的预设

如果您正在从 Ionic Auth Connect 迁移并且希望保留相同的提供者名称,使用 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

如果提供商需要自定义端点,请在预设中覆盖它们或绕过预设并直接在 oauth2.

选项类型是否必填描述
appId / clientId字符串OAuth2 客户端标识符
issuerUrlstringOIDC发现基址URL
authorizationBaseUrl / authorizationEndpointstring是*授权端点URL
accessTokenEndpoint / tokenEndpointstring否*令牌端点URL
redirectUrlstring回调URL
scope / scopesstring / string[]请求的权限范围
pkceEnabled布尔默认为 true
responseType'code''token'默认为 'code'
resourceUrlstring用户信息或资源端点
logoutUrl / endSessionEndpointstring没有注销或结束会话 URL
postLogoutRedirectUrlstring没有注销后重定向 URL
additionalParametersRecord<string, string>没有额外的认证请求参数
additionalTokenParametersRecord<string, string>没有额外的令牌请求参数
additionalResourceHeadersRecord<string, string>没有额外的头部 resourceUrl
additionalLogoutParametersRecord<string, string>额外的登出参数
loginHint字符串快捷方式 additionalParameters.login_hint
prompt字符串快捷方式 additionalParameters.prompt
iosPrefersEphemeralSession布尔值iOS 上优先使用临时浏览器会话
logsEnabled布尔值没有启用详细调试日志

authorizationBaseUrlaccessTokenEndpoint 仅在 issuerUrl 足够用于发现。显式端点始终优先于发现的值。

使用 OAuth2 登录

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

在 Web 上重定向流

标题:Web 上的重定向流

如果您想使用全屏重定向而不是弹出窗口: 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);

提供商特定的示例

提供商特定的示例

GitHub 示例

GitHub 示例

使用 GitHub 时,您可以获得一个简单的 OAuth 应用流程和基本的用户资料:

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

Azure AD / Microsoft Entra ID 示例

Azure AD / Microsoft Entra ID 示例

当您需要 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 适合您需要 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);
}
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
idToken如果提供者返回了 OIDC ID 令牌,则为 OIDC 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 Portal,打开 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应用中添加准确的重定向 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 在您的应用中注册准确的回调 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',
    },
    },
    });

如果您的提供商支持 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活动。只有在您的应用程序需要不同的重定向模式时才添加自定义意图过滤器。
  • 重定向流程在提供商阻止弹出窗口或您的认证规则需要顶级导航时更好。
  • 一些提供商阻止直接浏览器令牌交换,使用CORS。 在这种情况下,请使用后端交换或允许公共客户端的提供商设置。
  • 安全最佳实践
  1. 一些提供商阻止直接浏览器令牌交换,使用CORS。 在这种情况下,请使用后端交换或允许公共客户端的提供商设置。 保持 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 方案。

大多数提供商只在您请求像这样的范围时才返回刷新令牌,或者在明确要求同意时。 offline_access 请查看提供商的具体政策。

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

继续使用通用 OAuth2 提供商

继续使用通用 OAuth2 提供商

如果您正在使用 通用 OAuth2 提供商 来规划身份验证和帐户流程,连接它到 使用 @capgo/capacitor-social-login 为原生能力在使用 @capgo/capacitor-social-login 中 @capgo/capacitor-social-login 为实现细节在 @capgo/capacitor-social-login 中 @capgo/capacitor-passkey 为实现细节在 @capgo/capacitor-passkey 中 @capgo/capacitor-native-生物识别 对于 @capgo/capacitor-native-生物识别 的实现细节, 双因素认证 对于双因素认证 的实现细节,