我正在使用RESTful API构建基于Pylons的Web应用程序,该API目前缺少任何身份验证.所以我要实现它,为了避免存储用户密码的所有麻烦和谨慎,我想使用OpenID进行身份验证.最好的方法是什么?这两件事是否兼容?是否存在使用OpenID的现有REST API,我可以从中获取灵感?
我现在花了一些时间研究这些选项,并想总结一下这些发现.首先,更多的上下文 - 我开发和控制服务和API使用者.消费者是基于Flash的应用程序,它由API现在提供的同一主机提供,应该在浏览器中使用.尚未见到第三方客户.
所以这个问题可以分为两部分,
如何通过API进行OpenID身份验证
如何在后续请求中维护"已验证"状态
对于第一部分,OpenID身份验证几乎总是包含交互式步骤.在身份验证过程中,很可能是用户在OpenID提供商的网页中,登录并按下"我同意"按钮的步骤.所以API不能也不应该透明地处理这个问题(没有"告诉我你的OpenID提供商和密码,我会做其余的事情").它能做的最好的是传递和返回客户端必须打开并遵循指令的HTTP链接.
维持"认证"状态
REST API应该是无状态的,每个请求应该包含处理它所需的所有信息,对吧?针对每个请求对OpenID提供程序进行身份验证没有任何意义,因此需要某种会话.用于通信会话密钥(或"访问令牌"或用户名/密码)的一些选项是:
HTTPS + BASIC身份验证(每个请求中的"授权:基本..."标头)
签署请求亚马逊式(每个请求中的"授权:AWS ..."标头)
OAuth:获取Access Token,在每个请求中包含该参数和一堆其他参数
存储会话密钥的Cookie(每个请求中的"Cookie:..."标头)
签名cookie,用于将会话信息存储在cookie本身中
现在只有一个API消费者,所以我选择了最简单的方法 - cookies.在Beaker的帮助下,它们在Pylons中非常容易使用.他们也在Flash应用程序中"正常工作" - 因为它在浏览器中运行,浏览器将在Flash应用程序的请求中包含相关的cookie - 应用程序根本不需要更改.这是一个StackOverflow问题,也提倡使用cookie:Web应用程序的RESTful身份验证
Beaker还具有仅限cookie的会话,其中所有会话数据都包含在cookie本身中.我想这是无关紧要的.有没有对服务器会话存储.Cookie已签名并可选择加密,以避免在客户端篡改它们.缺点是cookie变得更大,因为它现在需要存储的不仅仅是会话密钥.通过删除我在会话中不需要的一些东西(来自OpenID身份验证的剩余部分),我将cookie大小降低到大约200字节.