使用 OAuth 协议时,您需要从要委托的服务获取秘密字符串。如果您在网络应用程序中执行此操作,则可以简单地将机密存储在数据库或文件系统中,但在移动应用程序(或桌面应用程序)中处理它的最佳方法是什么?
将字符串存储在应用程序中显然不好,因为有人可以轻松找到它并滥用它。
另一种方法是将其存储在服务器上,并让应用程序在每次运行时获取它,而不是将其存储在手机上。这几乎同样糟糕,因为您必须在应用程序中包含 URL。
我能想到的唯一可行的解决方案是首先像平常一样获取访问令牌(最好使用应用程序内的 Web 视图),然后通过我们的服务器路由所有进一步的通信,这会将秘密附加到请求数据并进行通信与提供商。话又说回来,我是一个安全菜鸟,所以我真的很想听听一些知识渊博的人对此的看法。在我看来,大多数应用程序并没有采取这些措施来保证安全性(例如,Facebook Connect 似乎假设您将秘密放入应用程序中的字符串中)。
另一件事:我不相信最初请求访问令牌时涉及秘密,因此可以在不涉及我们自己的服务器的情况下完成此操作。我对么?
是的,这是我们自己面临的 OAuth 设计的问题。我们选择通过我们自己的服务器代理所有呼叫。 OAuth 在桌面应用程序方面并未完全被淘汰。在不更改 OAuth 的情况下,我发现没有完美的解决方案。
如果您想一想并问为什么我们有秘密,主要是为了提供和禁用应用程序。如果我们的秘密被泄露,那么提供商只能真正撤销整个应用程序。由于我们必须将我们的秘密嵌入到桌面应用程序中,所以我们有点搞砸了。
解决方案是为每个桌面应用程序设置不同的秘密。 OAuth 并没有让这个概念变得简单。一种方法是让用户自己创建一个秘密,然后将密钥自己输入到您的桌面应用程序中(一些 Facebook 应用程序很长一段时间都做了类似的事情,让用户去创建 Facebook 来设置他们的自定义测验和废话)。对于用户来说这并不是一个很好的体验。
我正在研究 OAuth 委托系统的提案。这个概念是,使用从提供商那里获得的我们自己的密钥,我们可以向我们自己的桌面客户端(基本上每个桌面应用程序一个)发布我们自己的委托密钥,然后在身份验证过程中我们将该密钥发送到顶层提供商给我们回电并与我们重新验证。这样我们就可以撤销我们向每个桌面客户端发布的自己的秘密。 (借用了 SSL 的很多工作原理)。整个系统非常适合增值 Web 服务以及将调用传递给第三方 Web 服务。
如果顶级提供商提供 API 来生成和撤销新的委托机密,则该过程也可以在没有委托验证回调的情况下完成。 Facebook 正在做类似的事情,允许 Facebook 应用程序允许用户创建子应用程序。
网上有一些关于这个问题的讨论:
http://blog.atebits.com/2009/02/fixing-oauth/
http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b820c14
Twitter和Yammer的解决方案是身份验证pin解决方案:https://dev.twitter.com/oauth/pin-based
https://www.yammer.com/api_oauth_security_addendum.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)