Обычный подход будет следующим:
- Ваш клиент (используя открытый ключ) запрашивает токен с сервера, токен проверяет, является ли ключ действительным и не занесен в черный список (вы можете просрочить / занести в черный список старые ключиесли они скомпрометированы)
- Токен отправляется каждый раз
- Сервер отвечает только при наличии токена
В зависимости от ваших требований, существует хакерский способреализовать это.
- Иметь переменную my_client со значением true
- При каждом запросе из вашего приложения переменная отправляется в ваших заголовках.
- Только для сервераинформация о серверах, если переменная «my_client» находится в заголовках
. Недостатки этого подхода в том, что он не совсем безопасен, потому что каждый человек может видеть запросы, которые он делает.Поэтому можно заметить эту дополнительную информацию.
Это настолько просто, что вы можете написать ее на минуту, просто как тест.
<?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;
}
}
}