将 api 密钥传递给 rest api

2022-08-30 15:12:57

我正在与 phil sturgeon REST_Controller合作,为 codeigniter 创建一个 REST api,到目前为止,我已经能够创建一个简单的库来为用户生成 api 密钥。我的问题是现在为每个请求将API密钥发送到API,我如何做到这一点,而不必为每个请求手动发送它。


答案 1

您应该研究请求签名。一个很好的例子是亚马逊的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()函数,它很流行发送签名请求。通常,您让用户执行一些操作,例如将所有参数放入数组中,按字母顺序排序,连接成字符串,然后该字符串以获取sig。在此示例中,您可以执行以下操作:hash_hmac

$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)

然后将其添加到上面提到的 REST URL 中。$sig


答案 2

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);

我的帐户用户名在您的网站上在哪里,并且将是我的API密钥。martinbean4eefab4111b2a


推荐