如何在RESTful API中使用OpenID?

问题描述:

我使用RESTful API构建基于Pylons的Web应用程序,该应用程序当前缺少任何验证。所以我要实现这一点,为了避免所有存储用户密码的麻烦和谨慎,我想使用OpenID进行身份验证。什么是最好的方法来做到这一点?这两件事是否兼容?是否存在使用OpenID的现有REST API,我可以从中获得灵感?如何在RESTful API中使用OpenID?

我现在已经花了一些时间研究这些选项并希望总结研究结果。首先,多一点上下文 - 我开发和控制服务和API消费者。消费者是基于Flash的应用程序,它从API现在使用的相同主机提供,并且应该在浏览器中使用。目前还没有第三方客户。

所以,问题可以分为两个部分进行划分,

  • 我怎么通过API做OpenID身份验证
  • 我怎么维持后续的请求“认证”状态

对于第一部分,OpenID身份验证几乎总是包含交互式步骤。在认证过程中,很可能会有一个步骤,用户在OpenID提供商的网页中,登录并按下一些“我同意”按钮。所以API不能也不应该透明地处理这个问题(没有“告诉我你的OpenID提供者和密码,我会做其余的”)。它能做的最好的是传递和返回客户端必须打开并遵循指示的HTTP链接。

保持“认证”状态

的REST API应该是无状态的,每个请求应包括处理它,正确的所需的所有信息?对于每个请求对OpenID提供者进行身份验证都没有任何意义,因此一些类型的会话是必需的。一些用于通信会话密钥(或“访问令牌”或用户名/密码)选项有:

  • HTTPS +基本身份验证(“授权:基本...”在每个请求头)
  • 签名请求Amazon-style(“授权:AWS ...”中的每个请求头)
  • 的OAuth:获取访问令牌,包括并在其存储会话密钥(“曲奇每个请求
  • 曲奇一群其他参数:... “每个请求中的标题)
  • 存储会话信息的签名cookie在饼干本身

现在只有一个API消费者,所以我选择了最简单的事情,可能工作 - 饼干。在Beaker的帮助下,它们非常易于在Pylons中使用。他们也在Flash应用程序中“正常工作” - 因为它在浏览器中运行,所以浏览器将在Flash应用程序发出的请求中包含相关的Cookie - 根本不需要更改应用程序。这里有一个*问题,也提倡使用cookies:RESTful authentication for web applications

烧杯也有很好的功能cookie-only sessions所有的会话数据都包含在cookie本身。我想这是关于无状态的。服务器上有没有会话存储。 Cookies被签名并且可选地被加密以避免在客户端篡改它们。缺点是cookie变得更大一些,因为它现在需要存储更多的会话密钥。通过删除一些我在会话中不需要的东西(来自OpenID身份验证的剩菜),我将cookie的大小降低到了大约200字节。

OAuth更适合API使用。以下是Python中使用的OAuth示例:oauth-python-twitter。 Leah Culver的python-oauth库是Python中OAuth的规范实现,但python-oauth2是最近引起一些嗡嗡声的竞争者。至于灵感,django-piston支持在为Django创建RESTful API时使用OAuth进行身份验证,尽管文档不如我想要的那个特定主题。

+0

API目前主要针对客户端 - 服务器场景。客户端是Flash应用程序,服务器是Pylons web应用程序。目前没有服务器到服务器的东西,所以不需要三条腿的东西。我目前的问题是如何在系统中引入“认证用户”,而不必处理存储密码,发送密码提醒,重置密码等。目前还不清楚OAuth如何帮助我,因为在2脚版本中它只是指定了如何签署请求。 – 2009-12-02 15:23:24

+1

在这种情况下,可能是http://pylonshq.com/pasties/by_tag/openid中的一个粘贴会有所帮助。 – 2009-12-02 16:06:56

如果您构建API,则可以检查OAuth协议。它是OpenID的补充。