小编Séb*_*ENT的帖子

没有会话的HTTP请求签名

我正在考虑一个休息网络服务,确保发送给他的每个请求:

  • 该请求是由声称它的用户生成的;
  • 该请求未被其他人修改(uri/method/content/date);
  • 对于GET请求,应该可以生成一个包含足够信息的URI,以检查签名并设置过期日期.这样,用户可以在具有生成的URI的资源上将临时READ权限委派给协作者一段有限的时间.

客户端使用id和基于密码的内容签名进行身份验证.

应该没有会话,所以服务器状态!服务器和客户端共享密钥(密码)

在考虑它并与一些非常好的人交谈之后,似乎没有任何休息服务可以做到这一点,就像它应该是我的用例一样简单.(HTTP摘要和OAuth可以在服务器状态下执行此操作并且非常繁琐)

所以我想象一个,我问你的伟大评论它应该如何设计(我将发布它OpenSource和希望它可以帮助其他人).

该服务使用自定义"Content-signature"标头来存储凭据.经过身份验证的请求应包含此标头:

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>;
Run Code Online (Sandbox Code Playgroud)

创建请求10分钟后,请求将失效.

例如,典型的HTTP REQUEST将是:

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" }
Run Code Online (Sandbox Code Playgroud)

服务器将回答:

401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

要么

200 OK
Run Code Online (Sandbox Code Playgroud)

变量将是:

<USERID> = 62ABCD651FD52614BC42FD
<REQUEST_HASH> = POST\n
                 /ressource\n
                 Sun, 06 Nov 1994 08:49:37 GMT\n
                 { …
Run Code Online (Sandbox Code Playgroud)

rest web-services restful-authentication http stateless-session

5
推荐指数
1
解决办法
4246
查看次数