Android 移动电话上使用代理服务器的OAuth是否太麻烦了?

Android 移动电话上使用代理服务器的OAuth是否太麻烦了?,android,ssl,mobile,oauth,xauth,Android,Ssl,Mobile,Oauth,Xauth,在过去的几天里,我一直在安装并运行OAuth实现。不是在Android上,而是在我的web服务器上,它将充当OAuth保护服务的代理。我正要实现我的Android客户端,我的头还在为安全和实现问题而烦躁不安 当客户端仅仅是一个web浏览器时,OAuth已经足够混乱了。您有以下一系列步骤: (客户端web浏览器)向我的代理服务器发出请求 (代理服务器)从OAuth提供商(例如web服务API)请求未经授权的令牌 (代理服务器)请求OAuth提供程序让用户授权令牌。将web浏览器重定向到OAuth

在过去的几天里,我一直在安装并运行OAuth实现。不是在Android上,而是在我的web服务器上,它将充当OAuth保护服务的代理。我正要实现我的Android客户端,我的头还在为安全和实现问题而烦躁不安

当客户端仅仅是一个web浏览器时,OAuth已经足够混乱了。您有以下一系列步骤:

  • (客户端web浏览器)向我的代理服务器发出请求
  • (代理服务器)从OAuth提供商(例如web服务API)请求未经授权的令牌
  • (代理服务器)请求OAuth提供程序让用户授权令牌。将web浏览器重定向到OAuth提供程序的“授权”URI
  • (OAuth提供程序)用户完成授权后,将浏览器重定向到回调URI
  • (代理服务器::回调URI)交换访问令牌的授权令牌,然后将其存储以备将来调用
  • 对OAuth提供者进行API调用,并将响应文档返回到客户端web浏览器
现在这已经足够了。但当将同样的机制用于移动应用程序作为客户端时,它会变得更加复杂。当然,问题是在执行OAuth舞蹈时,您必须执行一些杂技才能将浏览器会话注入到移动应用程序的代码流中。这意味着您必须将OAuth舞蹈进一步复杂化,如下所示(我在本例中使用Android应用程序使事情具体化):

  • (移动web app::本机代码)使用Java/HTTP从代理服务器发出请求
  • (代理服务器)从OAuth提供商(例如web服务API)请求未经授权的令牌
  • (代理服务器)向移动web应用返回一个响应文档,其中包含OAuth提供商用户授权的重定向URI,最好进行模糊处理以隐藏用户密钥和其他详细信息,以阻止“空中”窥探
  • (移动web app)使用安装了意向过滤器的授权URL启动web浏览器活动。但是,请存储代理服务器指定的回调URI,然后用一个特殊的“虚假”URI替换它,该URI是为方便通过意图过滤器识别URI而精心设计的(请参见以下步骤)
  • (OAuth提供程序)用户完成授权后,将浏览器重定向到“虚假”回调URI
  • (移动web应用)意图过滤器检测“虚假”回调URI,并使用该信号重新获得控制权。重建代理服务器的回调URI并使用Java/HTTP执行请求
  • (代理服务器::回调URI)交换访问令牌的授权令牌,然后像以前一样存储它以备将来调用
  • 对OAuth提供商进行API调用,并将响应文档返回到移动web应用程序
正如你所看到的,这是相当可怕的。如果有一个更简单的方法来做这件事,那么我渴望听到它。据我所知,只有另外两种选择,每种选择都有自己的重大问题

1) 忘记代理服务器,直接从移动web应用程序执行所有操作。这里最大的安全漏洞是,你必须“烘焙”你的OAuth用户密钥,并将其秘密放入你的应用程序中。如果攻击者对您的代码进行反编译并查找这些字符串(对于有逆向工程经验的人来说,这是一个相当简单的操作),他们可能会对您的应用程序和用户造成严重破坏

2) 切换到XAuth,用户向您提供他们的登录名和密码,您“同意”不存储它们并直接与XAuth服务器交换访问令牌。第一个问题是获得用户对提供该信息的信任,创建OAuth就是为了解决这个问题,当然,对于那些不遵守放弃登录详细信息承诺的人呢?更糟糕的是,XAuth服务器必须支持XAuth并提供HTTPS(SSL)连接,我已经看到很多web API都不支持这两种连接。当然,SSL连接是必要的,因为如果没有SSL连接,在发出XAuth请求时,您将以纯文本形式通过网络发送用户的登录名和密码

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

因此,无论你怎么看,它看起来都非常丑陋,我甚至没有为用户创建和管理自己的用户ID,这样你就可以正确地查找存储在代理web服务器上的访问令牌(包括用户要管理的一个PIN码或访问码的混乱性)

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

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


--roschler

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

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