我正在用PHP开发REST API服务器,我打算通过客户端应用程序调用它,但是我想防止通过浏览器直接访问API。
例如说我对“ HOST / api / article / id”进行了GET调用,它将给定ID的文章返回给客户端应用程序。但是,当我在浏览器中键入“ HOST / api / article / id”时,不应返回该文章-我什么也不想发生(例如,只返回空页或403)。
我知道我可以实现某种授权(例如API密钥)来代替,该授权将只允许我打算执行的客户端应用程序执行API。
(我对此很陌生,所以也许我的问题没有道理。也许我误解了有关REST / HTTP /无论如何工作的一些基本知识。如果可以,请告诉我。)
答案 0 :(得分:1)
通常的方法是:
根据您的要求,可以采用一种简便的方法来实现此目的。
此方法的缺点是,这并不是真正安全的方法,因为每个人都可以看到他们提出的请求。因此可以注意到这些额外信息。
它是如此简单,您只需编写一分钟就可以将其作为测试。
<?php
if(!$_SERVER['HTTP_MY_CLIENT']){
header("HTTP/1.1 403 FORBIDEN");
}
在扩展使用标头变量的概念时,我们可以将其用作“半令牌”,这意味着我们将用一个只能读取的随机值填充该值。
所以这个概念是这样的:
客户->请求随机值 客户/设置每个请求标头中的值/ 客户端->向服务器发出请求。
<?php
/* A basic API token and authentication class. */
class SimpleToken
{
/* Creates a salt based on the passed key that is good for the current day */
public static function generateSalt($key)
{
return md5($key . date('Y-m-d'));
}
/* Crytographically combine the key and the salt to produce a token */
public static function generateToken($key, $content)
{
$package = $content . $key;
return crypt($package);
}
/* Generate a relatively strong SSL key */
public static function generateKey()
{
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
//Create a private key
$res = openssl_pkey_new($config);
//Extract the private part of the key
openssl_pkey_export($res, $private_key);
//Shorten it up for use in an API
return md5($private_key);
}
/* Verify the authenticity of the passed key/token pair */
public static function isAuthentic($key, $content, $token)
{
$package = $content . $key;
if(crypt($package, $token) == $token)
{
return true;
}
else
{
return false;
}
}
}