跳过内容

通用 OAuth2 提供商

GitHub

Capgo

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

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

在配置提供者之前,请收集:

  • 您的 OAuth 客户端 ID
  • 与您的应用程序方案或 Web 回调 URL 匹配的重定向 URL
  • 授权终端点
  • A token endpoint for authorization code flow, or an issuerUrl 您的应用程序需要的范围,例如
  • __CAPGO_KEEP_0__ 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',
},
},
},
});

是最简单的设置: 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,
},
},
});

作为别名

  • 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[]请求的权限
pkceEnabledboolean默认为 true
responseType'code''token'默认为 'code'
resourceUrlstring没有用户信息或资源端点
logoutUrl / endSessionEndpoint字符串没有注销或结束会话URL
postLogoutRedirectUrl字符串没有注销后重定向URL
additionalParametersRecord<string, string>没有额外的身份验证请求参数
additionalTokenParametersRecord<string, string>没有额外的令牌请求参数
additionalResourceHeadersRecord<string, string>没有额外的 resourceUrl
additionalLogoutParametersRecord<string, string>没有额外的
loginHint字符串没有快捷方式 additionalParameters.login_hint
prompt字符串没有快捷方式 additionalParameters.prompt
iosPrefersEphemeralSession布尔值没有iOS 上优先使用临时浏览器会话
logsEnabledboolean启用详细调试日志

authorizationBaseUrlaccessTokenEndpoint 只有在 issuerUrl 足够用于发现。Explicit 端点始终优先于发现的值。

使用 OAuth2 登录

使用 OAuth2 登录

登录

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

在 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 时,您可以获得简单的 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);

当提供者发布时使用发现 /.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 token 如果提供者返回了一个
refreshTokenRefresh token 如果请求的范围允许的话
resourceDataRaw JSON 从 resourceUrl
scope授权范围
tokenType通常 bearer
expiresInToken 生命周期(秒)

提供者设置参考

标题:提供者设置参考
  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 控制台 在 Capgo 中创建一个原生应用。

  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. 在 Okta 管理控制台中创建一个 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',
    },
    },
    });

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 If you want a private browser session with no shared cookies.

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。

providerId is required

标题:必须提供 providerId

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

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

OAuth2 provider "xxx" not configured

标题:未配置 OAuth2 提供者 "xxx"

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

重定向 URL 不匹配

标题:重定向 URL 不匹配
  • 与您的应用程序和提供商控制台中配置的重定向 URL 字符串完全匹配。
  • 注意尾随斜杠、方案不匹配和不同主机的差异。
  • 在设备上测试之前,确保已注册移动应用程序 URL 方案。

未返回刷新令牌

标题:未返回刷新令牌

大多数提供商仅在您请求像“openid profile”或“offline_access”等范围时才返回刷新令牌。请查看提供商的具体政策。 offline_access 令牌交换调试

标题:令牌交换调试

启用

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

相关文档部分

从通用 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-biometric 为 @capgo/capacitor-native-biometric 的实现细节, 和 双因素认证 为双因素认证的实现细节。