OAuth在手机上使用代理服务器太麻烦了吗?

Rob*_*ler 6 ssl mobile android oauth xauth

我花了最近几天才开始运行OAuth.不是在Android上,而是在我的网络服务器上,它将充当OAuth保护服务的代理.我正准备实施我的Android客户端,我的头脑仍然在讨论安全性和实施问题.

当客户端只是一个Web浏览器时,OAuth就足够混乱了.您有以下一系列步骤:

  • (客户端Web浏览器)向我的代理服务器发出请求
  • (代理服务器)从OAuth提供程序请求未经授权的令牌(例如 - Web服务API)
  • (代理服务器)要求OAuth提供商让用户授权令牌.将Web浏览器重定向到OAuth提供程序的"授权"URI
  • (OAuth提供程序)在用户完成授权后,将浏览器重定向到您的回调URI
  • (代理服务器::回调URI)访问令牌的Exchange授权令牌,然后将其存储以供将来调用
  • 对OAuth提供程序进行API调用,并将响应文档返回给客户端Web浏览器

现在这已经足够了.但是当使用与移动应用程序相同的机制作为客户端时,它会更加复杂.问题当然是你必须做一些杂技,以便在进行OAuth舞蹈时将浏览器会话注入到移动应用程序的代码流中.这意味着你必须进一步复杂化OAuth舞蹈如下(我在这个例子中使用Android应用程序来使事情具体化):

  • (移动Web应用程序::本机代码)使用Java/HTTP从代理服务器发出请求
  • (代理服务器)从OAuth提供程序请求未经授权的令牌(例如 - Web服务API)
  • (代理服务器)将响应文档返回到移动Web应用程序,该应用程序包含OAuth提供程序的用户授权的重定向URI,最好是模糊化以隐藏使用者密钥和其他细节以阻止"无线"窥探.
  • (移动Web应用程序)使用已安装intent过滤器的授权URL启动Web浏览器活动.但是,存储然后使用特殊的"假冒"URI替换代理服务器的指定回调URI,以便通过意图过滤器轻松识别URI(请参阅以下步骤)
  • (OAuth提供商)用户完成授权后,将浏览器重定向到您的"假冒"回调URI.
  • (移动网络应用程序)Intent过滤器检测"假"回调URI并使用该信号重新获得控制权.重建代理服务器的回调URI并使用Java/HTTP执行请求.
  • (代理服务器::回调URI)访问令牌的Exchange授权令牌,然后像以前一样将其存储以供将来调用
  • 对OAuth提供程序进行API调用,并将响应文档返回到移动Web应用程序

你可以看到这很可怕.如果有一个更简单的方法,那么我渴望听到它.据我所知,只有两个其他选择,每个都有自己的重大问题.

1)忘记代理服务器并直接从移动Web应用程序执行所有操作.这里最大的安全漏洞就是你必须在你的OAuth消费者密钥中"烘焙"并秘密进入你的应用程序.如果攻击者对您的代码进行反编译并搜索这些字符串,对于具有逆向工程经验的人来说,这是一个相当简单的操作,它们会对您的应用程序和用户造成严重破坏.

2)切换到XAuth,用户在那里向您提供他们的登录名和密码,并且您"同意"不存储它们并直接与XAuth服务器交换访问令牌.第一个问题是获得用户信任以提供该信息,创建OAuth以解决问题,当然还有那些不履行其放弃登录详细信息的承诺的人呢?更糟糕的是,XAuth服务器必须支持XAuth并提供HTTPS(SSL)连接,而且我已经看到大量不支持的Web API.当然,SSL连接是必要的,因为在没有它的情况下,您在发出XAuth请求时会以纯文本形式通过网络发送用户的登录名和密码.

http://blog.zyber17.com/post/1283741364/why-xauth-is-a-really-dumb-idea

仅供参考,虽然它不使用代理服务器,但以下示例说明了我将上述用于将浏览器会话注入您的移动应用OAuth交互并拦截回调URI的技术:

http://blog.doityourselfandroid.com/2010/11/10/oauth-flow-in-android-app/

所以你看它看起来很丑陋,我甚至没有为用户创建和管理你自己的用户ID而烦恼,这样你就可以正确查找存储在代理Web服务器上的访问权限(包括一个PIN或访问代码的混乱,供用户管理).

有趣的注意事项:在对Android网络浏览器会话安全性进行一些研究时,我很高兴地发现您不能访问当前的网页HTML.如果您可以访问它,那么恶意的Android编码器可以轻松地嗅出用户的登录名和密码,从而完全破坏OAuth的目的和意图.我很沮丧地发现可能有办法通过CacheManager对象获取HTML.奇怪的是,该对象现在已被弃用,并根据Android文档计划删除,因此希望这意味着Google发现了(潜在的)安全漏洞并正在采取措施在即将发布的版本中将其删除:

http://developer.android.com/reference/android/webkit/CacheManager.html

最后,我想听听那些在创建OAuth应用程序时遇到这些相同问题的人的想法.

- roschler

nmr*_*nmr 1

Janrain 发布了一个库,它提供了一些 UI 粘合和代理后端登录系统;它支持许多流行的 OAuth 身份提供商(例如 Google/FB)。在登录流程结束时,您会从设备获得 HTTPS POST,为您提供可交换用户标识符和其他信息的令牌,以及将访问令牌返回到设备的通道。

http://www.janrain.com/products/engage/mobile

https://github.com/janrain/engage.android

披露:我在 Janrain 的这个图书馆工作。