Подтвердить что ты не робот

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

Я хочу использовать методы и ресурсы из кода веб-сайта, который разработан в 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

Я прав?

Спасибо.

4b9b3361

Ответ 1

1, вы должны понять, на чью аутентификацию на токене. Это можно объяснить, как показано ниже.

Общая концепция системы аутентификации на токенах просто. Разрешить пользователям вводить свое имя пользователя и пароль, чтобы получить токен, который позволяет им получать определенный ресурс - без использования их имени пользователя и пароля. Как только их токен был, пользователь может предложить токен, который предлагает доступ к конкретный ресурс за период времени - на удаленный сайт.

Подробнее

Теперь посмотрим, какие шаги будут реализованы в веб-службе REST.

Он будет использовать следующий поток управления:

  • Пользователь вводит имя пользователя и пароль в форме входа в систему и нажимает кнопку "Вход".
  • После того, как запрос сделан, проверьте пользователя на сервере, запросив запрос в базе данных. Если запрос действителен, создайте токен используя пользовательскую информацию, полученную из базы данных, а затем возвратить эту информацию в заголовке ответа, чтобы мы могли хранить токен браузера в локальном хранилище.
  • Предоставление информации маркера в каждом заголовке запроса для доступа к ограниченным конечным точкам в приложении.
  • Если маркер, полученный из информации заголовка запроса, действителен, позвольте пользователю получить доступ к указанной конечной точке и ответить с помощью JSON или XML.

См. изображение ниже для потока управления

enter image description here

Вам может показаться, что JWT

JWT означает JSON Web Token и представляет собой формат токена, используемый в заголовки авторизации. Этот токен помогает вам конструировать коммуникацию между двумя системами безопасным способом. Пусть перефразировать JWT как "носитель" токен "для целей этого учебника. Знак-носитель состоит из три части: заголовок, полезная нагрузка и подпись.

  • Заголовок является частью токена, который поддерживает тип токена и метод шифрования, который также зашифровывается с базой 64.
  • Полезная нагрузка включает в себя информацию. Вы можете поместить любые данные, такие как информация о пользователе, информация о продукте и т.д., Все из которых хранится с шифрование base-64.
  • Подпись состоит из комбинаций заголовка, полезной нагрузки и секретного ключа. Секретный ключ должен быть надежно сохранен на стороне сервера. Вы можете увидеть схему JWT и примерный токен ниже;

enter image description here

Вам не нужно реализовывать генератор токенов-носителей, поскольку вы можете использовать php-jwt.

Надеюсь, что это объясняет ваше замешательство. если вы столкнетесь с любыми проблемами, связанными с аутентификацией на токенах, дайте мне знать. Я могу вам помочь.