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

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

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

Для этого я разработал API REST, используя Slim framework .

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

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

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

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

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

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

 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 

Я прав?

Благодарю.

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

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

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

Прочитайте больше

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

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

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

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

введите описание изображения здесь

Вам может быть интересно, что такое JWT

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

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

введите описание изображения здесь

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

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