通用 OAuth2 服务商
复制一个包含安装步骤和本插件的完整 Markdown 指南的配置提示。
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', }, }, },});OIDC发现和别名
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, }, },});该插件还支持常见的OAuth和OIDC别名:
clientId作为appIdauthorizationEndpoint作为authorizationBaseUrltokenEndpoint作为accessTokenEndpointendSessionEndpoint作为logoutUrlscopes作为scope
也可用:
additionalParameters用于 auth 请求重写additionalTokenParameters用于 token 交换重写additionalResourceHeaders用于自定义资源端点头additionalLogoutParameters和postLogoutRedirectUrl用于注销流程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:
auth0azurecognitooktaonelogin
如果提供商需要自定义端点,请在预设中覆盖它们或绕过预设并直接在 oauth2.
配置选项
标题:配置选项| 选项 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
appId / clientId | 字符串 | 是 | OAuth2 客户端标识符 |
issuerUrl | string | 否 | OIDC发现基址URL |
authorizationBaseUrl / authorizationEndpoint | string | 是* | 授权端点URL |
accessTokenEndpoint / tokenEndpoint | string | 否* | 令牌端点URL |
redirectUrl | string | 是 | 回调URL |
scope / scopes | string / string[] | 否 | 请求的权限范围 |
pkceEnabled | 布尔 | 否 | 默认为 true |
responseType | 'code' 或 'token' | 否 | 默认为 'code' |
resourceUrl | string | 否 | 用户信息或资源端点 |
logoutUrl / endSessionEndpoint | string | 没有 | 注销或结束会话 URL |
postLogoutRedirectUrl | string | 没有 | 注销后重定向 URL |
additionalParameters | Record<string, string> | 没有 | 额外的认证请求参数 |
additionalTokenParameters | Record<string, string> | 没有 | 额外的令牌请求参数 |
additionalResourceHeaders | Record<string, string> | 没有 | 额外的头部 resourceUrl |
additionalLogoutParameters | Record<string, string> | 不 | 额外的登出参数 |
loginHint | 字符串 | 不 | 快捷方式 additionalParameters.login_hint |
prompt | 字符串 | 不 | 快捷方式 additionalParameters.prompt |
iosPrefersEphemeralSession | 布尔值 | 不 | iOS 上优先使用临时浏览器会话 |
logsEnabled | 布尔值 | 没有 | 启用详细调试日志 |
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 上的重定向流如果您想使用全屏重定向而不是弹出窗口: 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 示例
标题:“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 |
idToken | 如果提供者返回了 OIDC ID 令牌,则为 OIDC ID 令牌 |
refreshToken | 如果请求的范围允许,则为刷新令牌 |
resourceData | 从原始 JSON 中获取 resourceUrl |
scope | 授权范围 |
tokenType | 通常 bearer |
expiresIn | 令牌有效期(秒) |
提供商设置参考
提供商设置参考GitHub
GitHub-
创建 OAuth 应用 打开 GitHub 开发者设置 并创建一个新的 OAuth 应用
-
设置回调 URL 使用您的应用程序重定向 URL,例如
myapp://oauth/github. -
配置插件
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-
注册应用 前往 Azure Portal,打开
App registrations并创建一个本机或移动应用程序注册。 -
添加重定向 URI 添加一个与您的应用程序回调 URL 匹配的移动或桌面重定向 URI。
-
配置插件
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',},},});
Auth0
标题为“Auth0”的部分-
创建本机应用 打开 Auth0 控制台 并创建一个本机应用。
-
设置允许的回调 URL 在您的Capacitor应用中添加准确的重定向 URL。
-
配置插件
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',},},});
Okta
Okta部分-
创建 OIDC 原生应用 在 Okta 管理控制台中,创建 OIDC 原生应用。
-
添加重定向 URI 在您的应用中注册准确的回调 URL。
-
配置插件
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 提供商
Section titled “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, }, },});如果发现不可用,请手动配置授权和令牌端点。
平台特定说明
Section titled “平台特定说明”- 该插件使用
ASWebAuthenticationSession. - 设置
iosPrefersEphemeralSession: true如果您想使用无共享 cookie 的私有浏览器会话。
Android
Android- OAuth重定向返回通过您的应用程序方案和主机。
- 确保提供商回调URL与您的Android深度链接设置完全匹配。
- 插件已经处理OAuth活动。只有在您的应用程序需要不同的重定向模式时才添加自定义意图过滤器。
- 重定向流程在提供商阻止弹出窗口或您的认证规则需要顶级导航时更好。
- 一些提供商阻止直接浏览器令牌交换,使用CORS。 在这种情况下,请使用后端交换或允许公共客户端的提供商设置。
- 安全最佳实践
弹出式流程是默认的,适用于单页应用程序。
重定向流程在提供商阻止弹出窗口或您的认证规则需要顶级导航时更好。-
一些提供商阻止直接浏览器令牌交换,使用CORS。 在这种情况下,请使用后端交换或允许公共客户端的提供商设置。 保持
pkceEnabled: true适用于公共客户端。 -
优先使用 code 授权流程
responseType: 'code'比隐式流程更安全。 -
在后端验证令牌 在服务器端解码和验证发行者、受众、过期时间和签名
-
安全存储刷新令牌 对于原生应用程序,请将此插件与 @capgo/capacitor-persistent-account.
-
使用 HTTPS 生产认证端点和注销端点始终应使用 HTTPS。
providerId is required
Section titled “必须提供 providerId”每个 OAuth2 方法都需要配置的提供者密钥:
await SocialLogin.login({ provider: 'oauth2', options: { providerId: 'github' },});OAuth2 provider "xxx" not configured
Section titled “OAuth2 提供者 “xxx” 未配置”Call SocialLogin.initialize() 在登录之前确保 providerId 与 oauth2.
重定向 URL 不匹配
Section titled “重定向 URL 不匹配”- 将您的应用和提供商控制台中配置的重定向 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-生物识别 的实现细节, 双因素认证 对于双因素认证 的实现细节,