【发布时间】:2011-05-29 15:20:16
【问题描述】:
我正在考虑一个休息网络服务,以确保发送给他的每个请求:
- 请求是由声明它的用户生成的;
- 请求未被其他人修改(uri/method/content/date);
- 对于 GET 请求,应该可以生成一个包含足够信息的 URI,以检查签名并设置到期日期。这样一来,用户就可以在有限的时间内将临时 READ 权限委托给协作者,使用生成的 URI 访问资源。
客户端通过 id 和基于其密码的内容签名进行身份验证。
根本不应该有会话,所以服务器状态!服务器和客户端共享一个密钥(密码)
经过思考并与一些非常好的人交谈后,似乎没有其他服务可以像我的用例那样简单地做到这一点。 (HTTP Digest 和 OAuth 可以通过服务器状态来做到这一点,而且非常健谈)
所以我想象了一个,我正在向您的伟大的 cmets 询问它应该如何设计(我将发布它开源并希望它可以帮助其他人)。
该服务使用自定义“内容签名”标头来存储凭据。经过身份验证的请求应包含此标头:
Content-signature: <METHOD>-<USERID>-<SIGNATURE>
<METHOD> is the sign method used, in our case SRAS.
<USERID> stands for the user ID mentioned earlier.
<SIGNATURE> = SHA2(SHA2(<PASSWORD>):SHA2(<REQUEST_HASH>));
<REQUEST_HASH> = <HTTP_METHOD>\n
<HTTP_URI>\n
<REQUEST_DATE>\n
<BODY_CONTENT>;
请求在创建 10 分钟后失效。
例如,典型的 HTTP 请求是:
POST /ressource HTTP/1.1
Host: www.elphia.fr
Date: Sun, 06 Nov 1994 08:49:37 GMT
Content-signature: SRAS-62ABCD651FD52614BC42FD-760FA9826BC654BC42FD
{ test: "yes" }
服务器会回答:
401 Unauthorized
或
200 OK
变量是:
<USERID> = 62ABCD651FD52614BC42FD
<REQUEST_HASH> = POST\n
/ressource\n
Sun, 06 Nov 1994 08:49:37 GMT\n
{ test: "yes" }\n
URI 参数
一些参数可以添加到 URI 中(它们会重载标头信息):
- _sras.content-signature=
- - :将凭据放在 URI 中,而不是 HTTP 标头中。这允许用户共享已签名的请求; - _sras.date=Sun, 06 Nov 1994 08:49:37 GMT(请求日期*):创建请求的日期。
- _sras.expires=Sun, 06 Nov 1994 08:49:37 GMT(过期日期*):告诉服务器请求不应在指定日期之前过期
*日期格式:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
感谢您的 cmets。
【问题讨论】:
标签: web-services http rest restful-authentication stateless-session