我正在使用RESTful API构建基于Pylons的Web应用程序,目前缺少任何身份验证。所以我要实现它,为了避免存储用户密码的所有麻烦和谨慎,我想使用OpenID进行身份验证。最好的方法是什么?这两件事是否兼容?是否存在使用OpenID的现有REST API,我可以从中获取灵感?
答案 0 :(得分:31)
我现在花了一些时间研究这些选项,并希望总结一下这些发现。 首先,更多的上下文 - 我开发和控制服务和API使用者。消费者是基于Flash的应用程序,它由API现在提供的同一主机提供,应该在浏览器中使用。尚未见到第三方客户。
所以这个问题可以分为两部分,
对于第一部分,OpenID身份验证几乎总是包含交互式步骤。在身份验证过程中,很可能是用户在OpenID提供商的网页中,登录并按下“我同意”按钮的步骤。所以API不能也不应该透明地处理这个问题(没有“告诉我你的OpenID提供商和密码,我会做其余的事情”)。它能做的最好的是传递和返回客户端必须打开并遵循指令的HTTP链接。
维持“已验证”状态
REST API应该是无状态的,每个请求都应包含处理它所需的所有信息,对吧?针对每个请求对OpenID提供程序进行身份验证没有任何意义,因此某些类型的会话是必需的。用于传递会话密钥(或“访问令牌”或用户名/密码)的一些选项是:
现在只有一个API消费者,所以我选择了最简单的方法 - cookies。在Beaker的帮助下,它们在Pylons中非常容易使用。他们也在Flash应用程序中“正常工作” - 因为它在浏览器中运行,浏览器将在Flash应用程序的请求中包含相关的cookie - 应用程序根本不需要更改。这是一个也提倡使用cookie的StackOverflow问题:RESTful authentication for web applications
Beaker还有cookie-only sessions的很好的功能,其中所有会话数据都包含在cookie本身中。我想这是无关紧要的。服务器上有 no 会话存储。 Cookie已签名并可选择加密,以避免在客户端篡改它们。缺点是cookie变得更大,因为它现在需要存储的不仅仅是会话密钥。通过删除一些我在会话中不需要的东西(OpenID身份验证剩余的东西),我将cookie大小减少到大约200字节。
答案 1 :(得分:4)
OAuth更适合API使用。以下是Python中使用的OAuth示例:oauth-python-twitter。 Leah Culver的python-oauth库是Python中OAuth的规范实现,但python-oauth2是最近的竞争者,它正在获得一些嗡嗡声。至于灵感,django-piston支持在为Django创建RESTful API时使用OAuth进行身份验证,尽管文档不如我对该特定主题那样好。
答案 2 :(得分:3)
如果您构建API,则可以检查OAuth协议。它是OpenID的补充。