Как безопасно реализовать «Аутентификацию на основе токенов» для доступа к ресурсам сайта (т. Е. Функциям и данным), разработанным в PHPFox?

Я хочу использовать методы и ресурсы из кода сайта, который разработан вPHPFox.

В основном я получу запрос отiPhone/AndroidЯ получу запрос и передам соответствующую функцию из кода PHPFox, возьму ответ от этой функции и верну его обратно на устройство.

Для этого я разработал REST API, используяТонкий каркас.

Но основной блокиратор, с которым я сталкиваюсь в настоящее время, заключается в доступе к ресурсам (то есть функциям и данным) веб-сайта PHPFox.

Я не понимаю, как я должен аутентифицировать пользователя, используя«Аутентификация на основе токенов» для доступа к ресурсам сайта.

Если бы кто-то мог направить меня в правильном направлении с помощью некоторого полезного рабочего примера, это было бы очень полезно для меня.

Нотабене : Предлагаемая реализация «Аутентификации на основе токенов» должна быть очень безопасной и быстрой по скорости. Безопасность не должна быть поставлена ​​под угрозу.

Ниже приведен код, который я пробовал самостоятельно, но я не знаю, правильно он или нет. Мой подход правильный или неправильный. Пожалуйста, кто-нибудь проанализирует это и дайте мне знать ваши отзывы об этом.

Для создания токена я использую эту функцию, которая принимает в качестве параметров данные пользователя

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 + его данные, закодированные) и его данные не закодированы:

function auth($login, $password)
{
    // we check user. For instance, it's 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's 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

Я прав?

Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос