Я хочу использовать методы и ресурсы из кода веб-сайта, который разработан в PHPFox.
В принципе, я получаю запрос от iPhone/Android
, я получу запрос и передаю соответствующую функцию из кода PHPFox, отвечу от этой функции и верну ее обратно на устройство.
Для этой цели я разработал API REST, используя Slim framework.
Но основным блокиратором, с которым я сейчас сталкиваюсь, является доступ к ресурсам (т.е. функциям и данным) веб-сайта PHPFox.
Я не понимаю, как я должен аутентифицировать пользователя, используя "Аутентификация на основе токенов" , чтобы получить доступ к ресурсам веб-сайта.
Если кто-то может вести меня в правильном направлении с помощью некоторого полезного рабочего примера, это будет действительно полезно для меня.
N.B.: Предлагаемая реализация "Аутентификация на основе токенов" должна быть очень безопасной и быстрой в скорости. Безопасность не должна быть скомпрометирована.
Ниже приведен код, который я пробовал самостоятельно, но я не знаю, правильно это или нет. Является ли мой подход правильным или неправильным. Пожалуйста, кто-то проанализирует это и сообщит мне о вашей обратной связи.
Чтобы создать токен, я использую эту функцию, которая принимает как параметры, пользовательские данные
define('SECRET_KEY', "fakesecretkey");
function createToken($data)
{
/* Create a part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be 'stronger' of course
/* Encoding token */
$token = hash('sha256', $tokenGeneric.$data);
return array('token' => $token, 'userData' => $data);
}
Таким образом, пользователь может аутентифицировать себя и получить массив, который содержит токен (genericPart + его данные, закодированный) и hisData, не закодированный:
function auth($login, $password)
{
// we check user. For instance, it ok, and we get his ID and his role.
$userID = 1;
$userRole = "admin";
// Concatenating data with TIME
$data = time()."_".$userID."-".$userRole;
$token = createToken($data);
echo json_encode($token);
}
Затем пользователь может отправить мне свой токен + его некодированные данные, чтобы проверить:
define('VALIDITY_TIME', 3600);
function checkToken($receivedToken, $receivedData)
{
/* Recreate the generic part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"];
// We create a token which should match
$token = hash('sha256', $tokenGeneric.$receivedData);
// We check if token is ok !
if ($receivedToken != $token)
{
echo 'wrong Token !';
return false;
}
list($tokenDate, $userData) = explode("_", $receivedData);
// here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired
// if token expired we return false
// otherwise it ok and we return a new token
return createToken(time()."#".$userData);
}
$check = checkToken($_GET['token'], $_GET['data']);
if ($check !== false)
echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request
Я прав?
Спасибо.