ios - 是否可以使 iOS 上的 oauth 安全?

标签 ios facebook oauth

是否可以使 iOS 上的 oauth 安全?

我正在调查OAuth 2.0作为对 iOS 应用程序“套件”实现单点登录 + 授权的一种方式。为了解释我的担忧,我将简化并使用 Facebook + 一个使用 Facebook 进行身份验证的第 3 方应用程序(假设 Words/“Words with Friends”)。

为了示例的目的,我假设 Facebook 注册以支持方案/协议(protocol)“facebook://”,而 Words 注册以支持“words://”

我还假设无法保护 iOS 应用程序中的“客户端 secret ”或协议(protocol),因为您可以反编译该应用程序。我想出的任何方法来确保这个结果在 security by obscurity 中.

另一个假设是没有办法阻止两个应用程序注册处理相同的协议(protocol)。当两个应用程序都注册同一协议(protocol)时的行为是不确定的。 (虽然看起来第一个在设备上启动的应用程序已注册,而第二个应用程序注册被忽略)

如果我了解 iOS 设备上 Facebook(用户代理)和 Words(客户端)之间的工作流程:

  • 用户启动 Words
  • 用户选择通过 Facebook 凭据登录
  • Words 调用 openUrl("facebook://"),其中包含 Words 作为应用程序的标识符和重定向 uri(即“words://”)
  • iOS 启动 Facebook 应用
  • 用户输入凭据,Facebook 应用程序根据 Facebook 授权服务器验证凭据。
  • 提示用户授权 Words 访问 Facebook 数据(即 Words 可以访问我的好友列表)
  • Facebook 调用 Words 提供的回调 uri 以及访问 token (即 words://access_token?token_here)
  • Words 使用此 token 访问我的好友列表(即 protected 资源数据)

假设以上是正确的,如果我想恶意访问随机人的 friend 列表,我可以创建一个应用程序,该应用程序也注册处理协议(protocol)“words://”并在应用程序商店上获取它。如果有人安装了我的应用程序和 Words,并且我的应用程序是成功注册的应用程序(即在 Words 之前在设备上启动),则:

  • 启动 Words,选择登录,启动 Facebook
  • 用户认证/授权
  • Facebook 尝试通过在重定向 URL 上调用 openUrl 来重定向回 Words
  • 我的应用程序(不是 Words)已启动
  • 我的应用程序现在可以访问授权码,该授权码(通过反编译获知 secret )可以交换为 access_token,有权访问您的 friend 列表

我希望我的推理在上面是有缺陷的,否则我将不得不(特别是)得出结论,即 Facebook iOS 对第 3 方应用程序的身份验证是不安全的。

更一般地说,是否可以在 iOS 应用程序上安全地实现 OAuth 2.0(授权/隐式授权工作流)?

最佳答案

Google 针对这个问题提出了一个实验性解决方案,他们称之为 OAuth 2.0 for Installed Applications .

The Google OAuth 2.0 endpoint supports applications that are installed on a device...it is assumed that these applications cannot keep secrets.

本质上,共享 secret 被视为非 secret 。

在撰写本文时,大多数 OAuth 2.0 服务器似乎不支持这种实验设计。

这种设计带来了攻击者可能创建一个新客户端的风险,该客户端将自己表示为授权服务器的应用程序(攻击者需要获取您在问题中描述的客户端标识符,或者通过以下技术之一建议 here )。

但是,资源所有者(用户)不太可能授权恶意应用程序对 protected 资源采取任何操作这一事实似乎减轻了这种风险,因为他/她知道该应用程序不是,事实上,您的应用程序。

关于ios - 是否可以使 iOS 上的 oauth 安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331180/

相关文章:

Android - Facebook - Parse.com - 应用程序在登录期间随机关闭

azure - AcquireToken 异步在到期时间之前返回相同的 token

oauth - 要求 Google 返回电子邮件地址作为 OAuth 的一部分

ios - 从 WatchExtension 在日历中添加事件

iphone - 如何使用隐藏的导航栏将导航 Controller 正确添加到我的搜索 View

javascript - 是否可以将用户从网页重定向到 iPhone 主屏幕?

facebook - 可以通过网络访问 facebook 对象,但不能使用 API 访问

ios - FBSDKLoginBehaviorSystemAccount 不工作

oauth - 之前未发生的 Skype Bot OAuth 错误

ios - 从地址簿问题中获取号码