【发布时间】:2012-01-23 22:45:19
【问题描述】:
我正在使用 phil sturgeon REST_Controller 为 codeigniter 创建一个 REST api,到目前为止,我已经能够创建一个简单的库来为用户生成 api 密钥。 我现在的问题是为每个请求将 api 密钥发送到 API,我如何做到这一点而不必为每个请求手动发送它。
【问题讨论】:
标签: php codeigniter rest api-key
我正在使用 phil sturgeon REST_Controller 为 codeigniter 创建一个 REST api,到目前为止,我已经能够创建一个简单的库来为用户生成 api 密钥。 我现在的问题是为每个请求将 api 密钥发送到 API,我如何做到这一点而不必为每个请求手动发送它。
【问题讨论】:
标签: php codeigniter rest api-key
您应该查看请求签名。一个很好的例子是Amazon's S3 REST API。
概述实际上非常简单。用户有两个重要的信息可以使用您的 API,一个公共用户 ID 和一个私有 API 密钥。他们将公共 ID 与请求一起发送,并使用私钥对请求进行签名。接收服务器查找用户的密钥并确定签名请求是否有效。流程是这样的:
/user/update?email=new@example.com。/user/update?email=new@example.com&userid=123&sig=some_generated_string
此方法可确保 API 密钥永远不会作为通信的一部分发送。
看看 PHP 的 hash_hmac() 函数,它在发送签名请求时很受欢迎。通常,您会让用户执行一些操作,例如将所有参数放入一个数组中,按字母顺序排序,连接成一个字符串,然后 hash_hmac 该字符串以获取 sig。在此示例中,您可能会这样做:
$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
然后如上所述将$sig 添加到 REST url。
【讨论】:
/user/update?email=new@example.com&userid=123&sig=some_generated_string 现在不能有人劫持some_generated_string 并发送它,就好像它来自他们自己一样? (我敢肯定他们不能,但也许你能告诉我为什么?)
evil@example.com,签名将不再匹配,并且 REST 服务器将在尝试验证请求时拒绝该请求。
REST 的理念是它是无状态的,因此没有会话或任何东西。如果您想进行身份验证,那么这就是密钥的来源,并且必须为每个请求传递密钥,并且每个请求都会对用户进行身份验证(因为 REST 是无状态的,我是否提到过这一点?)。
您可以通过多种方式传递密钥。您可以将其作为参数传递(即http://example.com/api/resource/id?key=api_key),也可以将其作为 HTTP 标头的一部分传递。我见过指定您发送用户名和 API 密钥作为 HTTP 基本访问授权标头的密码部分的 API。
一个示例请求:
<?php
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => 'http://example.com/api/resource/id',
CURLOPT_USERPWD => 'martinbean:4eefab4111b2a'
));
$response = curl_exec($ch);
martinbean 是我在您网站上的帐户用户名,4eefab4111b2a 是我的 API 密钥。
【讨论】: