跳过主要内容

5步实现Capacitor应用中的OAuth2

本指南提供了简洁的步骤和最佳实践,帮助您在Capacitor应用中集成安全的OAuth2认证。

马丁·多纳迪厄

马丁·多纳迪厄

内容营销

5步实现Capacitor应用中的OAuth2

想在应用中添加安全的OAuth2认证吗 OAuth2 为您的 Capacitor 应用程序?以下是一份快速入门指南。

OAuth2 是一种协议,允许用户分享他们的数据而不共享密码。它适用于 Capacitor 应用程序,因为它可以跨 iOS、Android 和 Web 平台工作。它还通过使用令牌而不是存储敏感凭证来保持应用程序的安全。

以下是如何将 OAuth2 集成到您的 Capacitor 应用程序中的 5 步:

  1. 设置 OAuth2 提供商: 选择一个提供商(例如 Google, Auth0配置重定向 URI 和安全管理客户端凭据。
  2. 安装和配置 OAuth2 插件: 添加 @byteowls/capacitor-oauth2 插件并设置平台特定的设置(例如 Info.plist 对于 iOS, AndroidManifest.xml 对于 Android)。
  3. 构建身份验证流程: 使用插件处理用户登录、令牌存储和安全注销。启用 PKCE 以获得额外的保护。
  4. 跨平台测试: 在 iOS、Android 和 web 浏览器上验证流程。修复常见问题,如重定向 URI 匹配错误或 PKCE 错误。
  5. 安全您的实现: 在安全存储中存储令牌 (Keychain/Keystore), 使用 HTTPS, 并设置强大的 内容安全策略.

快速比较:安全令牌存储选项

存储选项最佳选择安全级别离线访问示例用例
安全存储移动应用刷新令牌
内存存储临时访问活动访问令牌
HttpOnly CookieWeb 应用浏览器会话

如何使用 Capacitor 添加到您的 Ionic 应用

Capacitor

YouTube 视频播放器 步骤 1:设置您的 OAuth2 服务提供商

正确设置 OAuth2 提供商是确保一切顺利运行的第一步和最关键一步。这涉及选择与您的应用程序要求相符的提供商、配置技术细节,如重定向 URI、并安全地处理您的凭据。这些步骤为接下来安装 OAuth2 插件打下了基础。

选择 OAuth2 提供商

首先选择一个与您的应用程序功能、安全需求和兼容性相匹配的 OAuth2 提供商。您正在构建的应用程序类型对确定将使用的 OAuth 2.0 流程起着至关重要的作用,这直接影响了您的提供商选择 [2]对于 Capacitor-基于的应用程序,建议使用 Authorization Code 流程与 PKCE - 这是移动应用程序的首选方法。

在比较提供商时,重点关注其安全功能。寻找像签名 cookie、CSRF 令牌验证和加密 JWT 等选项。如果您的应用程序处理敏感数据,则支持 多因素身份验证 是必不可少的。在评估时,应平衡成本和功能,根据您的需求而定,不要被繁琐的比较所困扰。

配置重定向 URI

重定向 URI 至关重要 - 它们告诉 OAuth2 提供商在用户完成身份验证后应该将用户发送到哪里。正确配置这些 URI 确保在移动和 web 平台上都能实现顺畅的体验。

对于移动应用程序,使用自定义 URL 方案,通常以 com.example.app://callback的格式呈现,其中 com.example.app 匹配您的应用程序包 ID。对于 web,使用 window.location.origin As __CAPGO_KEEP_0__ 的重定向 URI。如果您正在测试本地环境,类似于 http://localhost:8100/callback 的 URL 可以正常工作。

对于 iOS 用户,注意 Capacitor 的浏览器插件使用 SFSafariViewController。在 iOS 11 或更高版本中,这不会与 Safari 共享 Cookie,这可能会影响单点登录功能。如果 SSO 是必需的,请考虑使用支持 ASWebAuthenticationSession [3].

的插件。

管理客户端凭证

客户端凭证标识您的应用程序并向 OAuth2 提供商提供,包括客户端 ID 和客户端密钥。将客户端 ID 视为公共标识符,而客户端密钥应像私钥一样处理。

绝不将客户端密钥直接硬编码到应用程序中或提交到版本控制。相反,使用环境变量或安全密钥管理系统来存储它们。此外,优先选择短期令牌并最小化作用域,以限制暴露并增强安全性。

Now that your OAuth2 provider is ready, the next step is to add the plugin to your Capacitor app and set it up for iOS, Android, and web platforms.

现在您的 OAuth2 提供商准备就绪,下一步是将插件添加到您的 __CAPGO_KEEP_0__ 应用程序中,并为 iOS、Android 和 Web 平台进行设置。

The plugin works with most OAuth2 providers. To avoid compatibility issues, you’ll need to install the version that matches your __CAPGO_KEEP_0__ setup. @byteowls/capacitor-oauth2 根据您的Capacitor设置,以下是安装命令:

Capacitor v5

  • Capacitor v4: npm i @byteowls/capacitor-oauth2
  • Capacitor v3: npm i @byteowls/capacitor-oauth2@4
  • Capacitor v3: npm i @byteowls/capacitor-oauth2@3

配置插件设置npx cap sync安装后,您需要配置插件以匹配您的OAuth2提供者的设置。这可以通过在调用"方法时的"对象中完成。需要定义的关键参数包括:

Configure Plugin Settings

Configure Plugin Settings oauth2Options Configure Plugin Settings authenticate() Configure Plugin Settings

  • appId: 从 OAuth2 提供商获取的您的客户 ID。
  • authorizationBaseUrl: 提供商的授权端点。
  • responseType: 通常设置为 "code" for mobile apps.
  • redirectUrl: 必须与步骤 1 中配置的重定向 URL 匹配。

您还可以设置额外的参数,如 accessTokenEndpoint, scope, 以及针对特定平台的选项来微调身份验证过程。

对于 Android,更新您的 AndroidManifest.xml 并且 strings.xml 修改文件以包含正确的方案和主机信息。 在 iOS 上,修改 Info.plist 文件以注册您的重定向 URL 方案。 这些平台特定的更改确保在身份验证后用户会被重定向回您的应用。

检查Capacitor版本兼容性

验证插件版本与Capacitor版本匹配至关重要。 不匹配的版本可能会导致编译错误或运行时问题。 @byteowls/capacitor-oauth2 插件严格遵循Capacitor发布版本,因此在继续之前请务必检查兼容性。

插件版本Capacitor兼容版本备注
5.x5.x.x要求 Xcode 14.1. changelog 中记录的重大变更。
4.x4.x.x需要 Xcode 12.0。 changelog 中记录的重大变更。
3.x3.x.x需要 Xcode 12.0。 changelog 中记录的重大变更。
2.x2.x.x需要 Xcode 11.4。 changelog 中记录的重大变更。
1.x1.x.x

如果您正在开发 iOS 应用,请注意 Xcode 版本要求。使用不兼容的版本会阻止您的应用成功构建。插件文档包含详细的兼容性表格,这些表格是解决版本相关问题的宝贵资源。

如果安装后遇到问题,请卸载当前插件版本,安装适合您的 Capacitor 版本的正确插件,并再次运行同步命令。这比尝试强制不兼容版本工作更有效。

步骤 3:构建 OAuth2 认证流程

设置插件后,接下来是创建一个功能全面的认证流程。这一步确保了安全的用户登录、令牌管理和注销,使您的应用能够在多个平台上管理用户会话。

创建登录流程

登录流程从调用 authenticate() 开始,传入一个选项对象。这个对象应该包含您的 authorizationBaseUrl, redirectUrlresponseType 设置为 'code' 以符合 PKCE 要求。插件安全地打开提供者的登录页面,用户可以在此页面输入凭证。成功登录后,提供者会将用户重定向回您的应用,带有令牌和用户详细信息。

最好的部分是:用户直接在 OAuth2 提供者中输入凭证,因此您的应用永远不会访问敏感信息。该方法返回一个包含访问令牌、刷新令牌和用户数据(如电子邮件或个人资料详细信息)的响应对象。

在 iOS 和 Android 上,这个过程使用一个安全的 web 视图,共享 cookie 与系统浏览器。 在 web 平台上,它依赖于标准的浏览器重定向。 正确配置你的重定向 URL 确保无论平台如何都能提供smooth 用户体验。

处理 Token 存储和刷新

用户登录后,安全地管理 token 是你的下一个优先事项。 这包括安全地存储 token 和自动刷新它们以避免会话中断。 这是如何处理它的:

来保护令牌,即使设备被破坏也能保证令牌的安全。

当你的应用程序重新启动时,检查存储的令牌以便在不要求用户重新输入凭证的情况下重新登录用户。__CAPGO_KEEP_0__性能离线访问最佳使用场景
安全存储__CAPGO_KEEP_0__硬件加密中等刷新令牌,长期数据
内存存储高(临时)No有效访问令牌
常规存储非敏感偏好

为了保持会话有效,务必在令牌过期前刷新令牌。 在进行API调用之前,检查访问令牌是否即将过期。如果是,使用刷新令牌从您的OAuth2提供商那里获取一个新的访问令牌。 为提高可靠性,包括逻辑以重试令牌刷新,当网络重新连接时。 如果刷新令牌已过期或被撤销,请将用户重定向到登录流程以重新验证。

添加注销功能

注销流程既安全又有效。首先通过提供商的端点撤销刷新令牌。然后清除令牌从安全存储中并重置用户数据以确保所有会话都已终止。

仅仅删除本地令牌是不够的。 OAuth2提供商通常维护服务器端会话,这些会话可能会自动重新验证用户。 撤销刷新令牌会打断授权许可证链,确保存储的凭证不能被重用。

“JWT访问令牌无法撤销。它们有效直到过期。由于它们是持有者令牌,因此无法使它们失效。” – lihua.zhang,Auth0员工 [5]

To revoke tokens, call the provider’s token revocation endpoint with the refresh token before clearing local storage. This server-side action prevents token misuse, even if credentials are compromised. After revocation, remove tokens from secure storage, reset cached user data, and navigate users back to the login screen.

For single sign-on (SSO) setups, decide whether logging out should also end sessions for other apps using the same provider. Additionally, make sure the logout process works smoothly during network interruptions by storing logout requests locally and retrying them when the connection is restored. This ensures proper cleanup on the provider’s end.

第 4 步:测试您的 OAuth2 集成

After setting up your OAuth2 configuration and developing the authentication flow, the next step is testing it thoroughly. This ensures your integration works seamlessly across devices and platforms, providing a reliable experience for your users. Testing involves verifying functionality on mobile devices and web browsers, while also identifying and resolving potential issues before launching your app.

在 iOS 和 Android 设备上测试

首先测试整个认证过程在物理 iOS 和 Android 设备上。

  • For iOS: 确保您的 URL 方案在文件中正确配置,并确认您的应用程序正确处理来自 OAuth2 提供商的重定向。避免使用 Info.plist for authorization requests, as it can lead to a WKWebView 在 iOS 中:确保 URL 方案在文件中正确配置,并确认应用程序正确处理来自 OAuth2 提供商的重定向。避免使用 disallowed_useragent error. 请使用类似 Google Sign-In for iOS 或 OpenID Foundation’s AppAuth for iOS 等库来有效地处理身份验证流程 [6].

  • For Android: 检查您的 AndroidManifest.xml includes 正确的意图过滤器,以便处理重定向 URI。与 iOS 类似,避免使用 android.webkit.WebView 来处理授权请求,因为这也可能导致 disallowed_useragent 错误。优先使用 Google Sign-In 或 OpenID AppAuth 等 Android 库 [6].

在两种情况下,测试错误场景,如不可用的授权服务器 [7]。如果您的应用程序请求多个权限(范围),请验证哪些已授予并处理某些可能被拒绝的情况 [6].

Test on Web

对于 Web 平台,请使用开发工具监视网络请求并确保令牌安全。类似 OAuth 2.0 Playground 的工具可以帮助您测试流程 [10], HTTP 拦截代理如BurpSuite 在测试过程中,提供更深入的见解 [11].

在测试时,使用Authorization Code授权码与PKCE,作为公共客户端的推荐方法。确保通过POST参数或头部值安全地传输机密信息,而不是通过URL参数。另外,实现安全头部,如 Referrer-Policy 以增强保护 [11].

修复常见问题

在测试过程中,您可能会遇到需要解决的常见问题:

  • 重定向URI错误::重定向URI不匹配,通常会导致“未授权客户端”错误。确保重定向URI在OAuth2提供商的设置、__CAPGO_KEEP_0__应用中的文件和原生平台清单中完全匹配。 capacitor.config.json file in your Capacitor app, and the native platform manifests.

    LBopp [8]

  • PKCE 验证错误: 确认 PKCE 支持和配置正确,因为这对于保护您的应用程序至关重要 [9].

  • 插件实现错误: Errors like “Plugin is not implemented on iOS” typically indicate missing configurations or issues within the Capacitor environment. Enable logging in your OAuth2 plugin to help identify and resolve these problems [4].

  • 状态不匹配错误: 如果授权请求中的状态参数与重定向响应中的状态参数不匹配,可能会出现安全风险,尤其是在使用自定义 OAuth 处理程序(如 Facebook)时。仔细检查您的自定义处理程序 code 以确保没有错误或配置错误 [4].

第 5 步:安全您的 OAuth2 实现

保护您的 OAuth2 整合至关重要,以保护敏感数据并最小化漏洞。以下是确保您的实现保持安全的关键实践

启用 PKCE 为了更好的安全性

PKCE

One of the most effective ways to secure your authorization flow is by enabling PKCE (Proof Key for Code Exchange). PKCE helps prevent unauthorized interception of authorization codes. Here’s how it works:

  • 首先,生成一个随机的 code_verifier 长度在 43 到 128 个字符之间。
  • 然后,创建一个 code_challenge 通过使用 SHA-256 对 code_verifier 进行哈希,然后将结果以 base64 URL 格式编码。

如果您正在使用 capacitor-community/generic-oauth2 插件,启用 PKCE 非常方便。以下是示例配置:

{
  responseType: "code",
  pkceEnable: true,
  redirectUrl: "com.companyname.appname:/"
}

此插件自动处理 PKCE,并且不支持Code流程。默认情况下, code_challenge_method 设置为“S256”,以便进行正确的验证 [12].

使用安全存储存储令牌

安全存储 OAuth2 令牌至关重要,以防止未经授权的访问。对于原生移动应用程序,请利用操作系统提供的安全存储:

  • 在 iOS 上,使用 硬件加密和操作系统级保护的密钥链。 在 Android 上,使用
  • Keystore ,它也支持生物识别 以增加安全性。 对于 Web 应用程序,存储令牌在

HttpOnly 安全 cookie 中, 属性以减轻跨站点脚本 (XSS) 风险。 SameSite 以下是安全存储选项的快速比较:

On Android, use the __CAPGO_KEEP_0__ for hardware-backed encryption and OS-level protection.

__CAPGO_KEEP_0__最佳选择安全性优势考虑因素
iOS 键盘原生 iOS 应用硬件加密和操作系统级保护需要平台特定实现
Android Keystore原生 Android 应用具有潜在生物识别保护的安全存储设备安全功能有所不同
HttpOnly CookiesWeb 浏览器抵抗 XSS 攻击并安全地自动传输必须配置同域名的 API 访问
前端的后端所有平台令牌永远不会暴露给客户端需要额外的服务器基础设施

为了提高安全性,请考虑使用短期访问令牌和加密存储。例如,Auth0 将活跃刷新令牌限制为每个用户每个应用程序 200 个,以减少风险 [13]您还可以通过使用 HttpOnly Cookies 的前端代理(BFF)来增强安全性 [14].

设置内容安全策略

除了安全存储之外,实施强大的内容安全策略(CSP)可以帮助保护您的应用程序免受跨站脚本攻击(XSS)和 code 注入攻击。您可以在服务器级别使用 Content-Security-Policy HTTP 头或通过添加一个 <meta> 标签在你的 HTML 中。

关键指令包括:

  • default-src: 为所有内容类型设置回退规则。
  • script-src: 控制哪些 JavaScript 文件被允许执行。
  • connect-src: 管理 API 调用和 OAuth2 交互。
  • frame-ancestors: 防止点击劫持通过限制谁可以在 iframe 中嵌入你的应用。

为了获得最大保护,使用严格的 nonce 或哈希代替广泛的 allowlist,并避免使用类似 unsafe-inline targetLanguage":"Chinese" unsafe-evalprotectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"] upgrade-insecure-requests texts":["或",". 如果您的应用程序正在从 HTTP 切换到 HTTPS,请考虑添加" frame-ancestors 'none'.

指令。要确保您的 OAuth2 内容不能被嵌入到其他地方,请设置"

结论和下一步"

You’ve successfully implemented OAuth2 authentication in your Capacitor app by following five core steps. These included setting up your OAuth2 provider, installing the required plugins, creating the authentication flow, testing across platforms, and securing your integration using PKCE and proper token storage. It’s important to remember that OAuth 2.0 is an 您已经成功在__CAPGO_KEEP_0__应用程序中实现了 OAuth2 身份验证,通过遵循五个核心步骤。这些步骤包括设置 OAuth2 提供商、安装所需插件、创建身份验证流程、在多个平台上进行测试以及使用 PKCE 和适当的令牌存储来安全地集成。重要的是要记住,OAuth 2.0 是一个"授权协议" [1],而不是身份验证协议"

Security is crucial, especially for mobile apps. Organizations using OAuth 2.0 report a 34% drop in API access security incidents compared to those relying on basic authentication methods [19]安全性至关重要,尤其是对于移动应用程序。使用 OAuth 2.0 的组织报告了与依赖基本身份验证方法的组织相比,__CAPGO_KEEP_0__访问安全事件的 34% 的降低"

. 通过采用最佳实践 - 如使用短期访问令牌、实现 PKCE 和安全存储令牌 - 您已经为应用程序的身份验证系统奠定了坚实的基础"、"现在,您可以探索如何在保持这种安全框架的同时扩展应用程序的功能"

Add More Features

在 OAuth2 已经建立之后,您有机会通过添加更多功能来增强您的应用。例如:

  • OpenID Connect (OIDC)扩展 OAuth 2.0 以支持用户身份验证和单点登录 (SSO) 功能 [16].
  • 多因素身份验证 (MFA)通过添加额外的保护层来提高安全性 [17].
  • 渐进式资料收集逐步收集用户资料以改善用户体验和注册体验 [15].

对于持续的维护和更新,考虑使用 Capgo,它允许您立即推送实时更新、修复和新功能 - 无需等待应用商店批准。这对于处理安全补丁或快速推出新身份验证功能尤其有用。

更多资源

为了进一步增强您的OAuth2实现,利用这些资源和策略:

  • API Gateway 安全:通过实施身份验证和授权措施、缓存、以及健壮的日志和分析来加强您的部署 [20].

  • Aaron Parecki的建议:根据Aaron Parecki的说法, OAuth 2.0 简化:

    “The Authorization Code Flow is the most secure of the OAuth 2.0 flows and should be used whenever possible for server-side applications” [18].

“Authorization __CAPGO_KEEP_0__ 流程是OAuth 2.0流程中最安全的,并且在服务器端应用程序中尽可能使用”

以下是您的下一步指南:阶段
关键关注领域管理令牌生命周期、强制 HTTPS 和安全存储敏感信息
令牌管理使用短期访问令牌并旋转刷新令牌
验证过程验证签名并检查令牌过期

通过定期安全审计和保持最新的实现来保持领先。例如,OAuth 2.1 引入了改进,如要求 PKCE 对所有授权 code 请求和淘汰较少安全流 [19]此外,Capacitor 文档和 OAuth2 插件仓库提供了持续的技术支持,以帮助维护和改进您的应用程序的身份验证系统

常见问题

常见问题

为什么应该在移动应用程序中使用 Authorization Code 流程与 PKCE 的 OAuth2?

为什么在移动应用程序中使用 Authorization Code 流程与 PKCE 的 OAuth2?

The Code 授权流程 因为它可以提高安全性,通过解决授权 code 被截取和中间人攻击等风险。 PKCE(证明密钥用于 Code 交换)通过添加额外的保护层来工作:它要求授权服务器验证一个唯一的 code 挑战。这确保了只有预期的应用程序才能完成身份验证过程。

移动应用程序,作为公共客户端,无法安全地存储客户端密钥。正是在这里 PKCE 介入 - 它允许您在不泄露敏感数据的情况下安全地验证用户。结果?一个更安全、更可靠的登录过程,改善了整体用户体验。

::: faq

FAQ

iOS、Android 和 Web 应用程序中如何安全存储 OAuth2 令牌? 为了在不同平台上安全存储 OAuth2 令牌,使用针对每个平台的安全存储解决方案

是必不可少的。对于 iOS,Keychain Services 是首选选项,而 Android 用户应该依赖 Android Keystore 系统。这些工具专门设计用于保护敏感数据,包括令牌。对于 Web,安全 cookie 或加密的浏览器存储可以作为有效的替代方案。 添加加密,例如 AES-256,提供了令牌的额外安全层。使用 短期令牌 PKCE (Proof Key for Code Exchange) 在 OAuth2 流程中,阻止未经授权访问的另一个聪明的做法是。为了获得更强的保护,请考虑在存储令牌时仅允许合法用户访问的生物识别身份验证。 :::

::: faq

在 Capacitor 应用中测试 OAuth2 集成时最常见的问题是什么,如何解决?

在 Capacitor 应用中测试 OAuth2 集成时,开发人员可能会遇到几个常见的问题。以下是需要注意的快速概述:

  • 无效的客户端凭证确保您的客户 ID 和密钥设置正确,并与 OAuth 提供商的配置详细信息匹配。即使是小的拼写错误也可能导致问题。
  • 重定向 URI 不匹配您的应用程序的重定向 URI 必须与 OAuth 提供商中注册的 URI 完全匹配。请务必检查以避免不必要的头痛。
  • 令牌过期令牌不会永远存在。设置可靠的令牌刷新系统来处理过期令牌,保持用户体验不受影响。
  • 权限配置不正确您在应用程序中请求的权限需要与 OAuth 提供商配置的权限匹配。权限不匹配可能导致意外错误。

为了解决这些问题,花时间彻底检查您的应用程序的 OAuth 设置。实现强大的错误处理,以便捕捉并解决问题,测试您的身份验证流程在不同场景下。工具,如 Capgo,可以使生活更轻松,允许您直接将更新和修复推送到您的应用程序,而不必等待应用商店批准,保持开发高效,用户满意。

Capacitor实时更新

当Web层bug出现时,通过Capgo将修复推送到应用程序,而不是等待几天的应用商店审批。用户在后台接收更新,而本机更改保持在正常审批路径中。

立即开始

博客最新文章

Capgo为您提供创建真正专业的移动应用所需的最佳见解。