如何处理用PHP编写的API的授权

时间:2011-10-20 03:55:43

标签: php api authentication rest

所以我有一个非常简单的服务提供API的想法,我知道如何在PHP中编写REST-ish API,但我所做的一切都可以自由访问。对于这个,我想通过密钥/密钥对或基本的http auth提供访问。

我不知道该怎么办。

1 个答案:

答案 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')获取原始请求正文。