所以我有一个非常简单的服务提供API的想法,我知道如何在PHP中编写REST-ish API,但我所做的一切都可以自由访问。对于这个,我想通过密钥/密钥对或基本的http auth提供访问。
我不知道该怎么办。
答案 0 :(得分:7)
它通过某种形式的HTTP标头工作。正常的登录过程通常使用cookie,因此发送的请求标头Cookie: FOO=owiegwoeugiaweg
由服务器接收。你也可以为API做同样的事情,但通常不是最好的事情。
使用某些标头字段(例如Authorization
标头:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
此标题可以包含您想要的任何内容。您可以使用一些自定义密码散列/密钥交换/任何算法,并要求客户端在Authorization
标头中发送此信息。如果你愿意的话,你也可以拿出自己的任何自定义标题。
RESTful验证请求的一种好方法是使用请求签名。该算法取决于您,但至少应包括当前时间,请求正文和用户特定密钥,它们被散列在一起形成签名。
headers:
Date: Thu, 20 Oct 2011 04:00:48 GMT
Authorization: MySchema user123:oiquwetfp32900fjp0q93t1039
where:
Date = timestamp, must be within 15 mins of server time
Authorization = MySchema USERNAME:SIGNATURE
SIGNATURE = sha1( Date + REQUEST BODY + PASSKEY )
这样你基本上就每个请求发送用户的密钥,但是以不可逆的方式进行加扰,对于每个请求都是唯一的,但是服务器可以通过重复相同的操作来确认(检查有效的时间戳,散列日期标题+请求正文+用户密码)。过去有很好的文档可以详细解释Amazon Web Services的这个过程,但我现在找不到它。尝试研究“请求签名”以获取更多信息。
在服务器端,您可以在$_SERVER
阵列中找到这些HTTP标头。您可以通过file_get_contents('php://input')
获取原始请求正文。