跳过内容

通用OAuth2提供者

GitHub

Introduction

简介

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

  • GitHub
  • __CAPGO_KEEP_0__
  • Auth0
  • Auth0
  • Okta
  • 自定义 OAuth2 或 OIDC 服务器

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

在配置供应商之前,请收集以下信息:

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

context: Capgo营销网站. 角色: UI标签. 见于: 页面代理/[slug].astro. 消息键 `agents_page_copy_label` (代理页面复制标签).

OIDC发现和别名

多提供者配置 issuerUrl 如果您的提供者公开了OpenID Connect发现文档,

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 该插件还支持常见的OAuth和OIDC别名: appId
  • authorizationEndpoint 作为别名 authorizationBaseUrl
  • tokenEndpoint 作为别名 accessTokenEndpoint
  • endSessionEndpoint 作为别名 logoutUrl
  • scopes 作为别名 scope

也可用

  • additionalParameters 用于认证请求覆盖
  • additionalTokenParameters 用于令牌交换覆盖
  • 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:

  • auth0
  • azure
  • cognito
  • okta
  • onelogin

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

配置选项

选项
类型必填描述字符串
appId / clientIdstring是OAuth2 客户端标识符
issuerUrl字符串否OIDC 发现基础 URL
authorizationBaseUrl / authorizationEndpoint字符串是*授权终端 URL
accessTokenEndpoint / tokenEndpoint字符串否*令牌终端 URL
redirectUrl字符串是回调 URL
scope / scopes字符串/字符串[]否请求的权限
pkceEnabled布尔否或 true
responseType'code' 字符串 'token'否或 'code'
resourceUrl或否用户信息或资源端点
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 中使用临时浏览器会话
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',
},
});

上下文: Capgo营销网站。角色: UI标签。位置: 页面代理/[slug].astro。消息键 `agents_page_copy_label` (代理页面复制标签)。

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
idTokenOIDC ID令牌,如果提供者返回了一个
refreshToken刷新令牌如果请求的权限范围允许
resourceData原始从 JSON 中获取的数据 resourceUrl
scope已授权的权限范围
tokenType通常 bearer
expiresInToken 生存时间(秒)

认证提供商设置参考

Provider setup reference

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

上下文:Capgo 市场网站。角色:UI 标签。见于:页面 agent/[slug].astro。消息键 `agents_page_copy_label` (Agents 页面复制标签)。

Azure AD / Microsoft Entra ID
  1. Azure AD / Microsoft Entra ID 部分 注册应用 App registrations前往 Azure Portal,打开

  2. 并创建一个本机或移动应用注册。 添加一个匹配应用回调 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.
  • Set iosPrefersEphemeralSession: true 如果您想要一个不共享Cookie的私人浏览器会话。

Android

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

Web

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

安全最佳实践

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

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

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

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

  5. 在所有地方使用 HTTPS 生产环境的认证端点和注销端点始终应使用 HTTPS。

故障排除

故障排除

providerId is required

故障排除

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

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

OAuth2 provider "xxx" not configured

故障排除

呼叫 SocialLogin.initialize() 在登录之前确保 providerId 匹配对象下面的 oauth2.

重定向 URL 不匹配

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

未返回刷新令牌

标题:未返回刷新令牌

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

标题:调试令牌交换

在提供商配置中启用

Enable 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-原生生物识别 为 @capgo/capacitor-native-biometric 的实现细节, 和 双因素认证 为双因素认证的实现细节。