通过api键休息api

MrF*_*Foh 29 php rest codeigniter api-key

我正在使用phil sturgeon REST_Controller为codeigniter创建一个REST api,到目前为止我已经能够创建一个简单的库来为用户生成api密钥.我的问题是现在为每个请求发送api密钥到API,如何在不必为每个请求手动发送它的情况下执行此操作.

zom*_*bat 53

您应该查看请求签名.一个很好的例子是亚马逊的S3 REST API.

概述实际上非常简单.用户有两个重要的信息来使用您的API,一个公共用户ID和一个私有API密钥.他们使用请求发送公共ID,并使用私钥对请求进行签名.接收服务器查找用户的密钥并确定签名的请求是否有效.流程是这样的:

  1. 用户加入您的服务并获取用户ID(例如123)和API密钥.
  2. 用户希望向您的API服务发出更新其电子邮件地址的请求,因此他们需要向您的API发送请求 /user/update?email=new@example.com.
  3. 为了能够验证请求,用户将用户ID和签名添加到呼叫中,因此呼叫变为 /user/update?email=new@example.com&userid=123&sig=some_generated_string
  4. 服务器接收呼叫,看到它来自userid = 123,并查找该用户的API密钥.然后,它复制从数据创建签名的步骤,如果签名匹配,则请求有效.

此方法确保API密钥永远不会作为通信的一部分发送.

看一下PHP的hash_hmac()函数,它在发送签名请求时非常流行.通常,您可以让用户执行类似操作,例如将所有参数放入数组中,按字母顺序排序,连接成字符串,然后连接hash_hmac该字符串以获取sig.在这个例子中你可能会这样做:

$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
Run Code Online (Sandbox Code Playgroud)

然后将其添加$sig到REST URL上,如上所述.

  • @jasondavis - 是的,有人可以嗅到那个特定的请求,这是事实.但是因为每个请求*的签名都会有所不同,所以嗅探它们并不好.充其量,他们所能做的就是发送完全相同的请求!他们无法生成恶意请求,因为要做到这一点,您需要秘密的API密钥.如果他们试图捣乱他们嗅探的请求中的数据,比如将电子邮件更改为"evil @ example.com",则签名将不再匹配,并且REST服务器将在尝试验证时拒绝该请求. (6认同)
  • 如果用户从javascript发出请求并因此将其API密钥暴露给整个世界,这种方法不安全吗?有人可以查看源代码,获取API密钥并使用相同的方法生成有效的请求来调用服务器.或者我错过了什么. (4认同)
  • @zombat这是一个非常好的问题baris-usakli问过.如何在JavaScript Web应用程序中隐藏API密钥?对于使用相同API的手机应用市场,即使有如何为每个下载的手机应用创建私有API并让API了解它? (2认同)

Mar*_*ean 6

REST的想法是它是无状态的 - 所以没有会话或任何东西.如果你想进行身份验证,那么这就是密钥进入的地方,必须为每个请求传递密钥,并且每个请求都会对用户进行身份验证(因为REST是无状态的,我提到过吗?).

您可以通过各种方式传递密钥.您可以将其作为参数传递(即http://example.com/api/resource/id?key=api_key),也可以将其作为HTTP标头的一部分传递.我见过API指定您发送用户名,API密钥作为HTTP基本访问授权标头的密码部分.

一个示例请求:

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

martinbean将在您的网站我的帐户的用户名,并且4eefab4111b2a将是我的API密钥.

  • 访问令牌是一种常用方法,但API密钥则不是.访问令牌到期,因此如果泄露,它不会是一个很大的安全漏洞.但是如果我有你的API密钥,我可以根据需要生成尽可能多的访问令牌.有一个很好的理由,所有这些服务都会给你一个"秘密"密钥...这应该是一个秘密.任何让你传递密钥的服务都是错误的. (5认同)
  • 这种方法很简单,但本质上不安全.有人可以轻松嗅探您的API密钥并开始自己使用它.如果您希望API密钥是私有的,则不希望将它们作为请求的一部分发送. (4认同)
  • 当他们在星巴克开放无线连接时,Campaign Monitor会有很多解释要求他们的客户第一次获得他们的API密钥被劫持. (2认同)