Я хочу использовать методы и ресурсы из кода веб-сайта, который разработан в 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
Я прав?
Благодарю.
Сначала вы должны понять, что такое аутентификация на токенах. Это можно объяснить следующим образом.
Общая концепция системы аутентификации на токенах проста. Разрешить пользователям вводить свое имя пользователя и пароль, чтобы получить токен, который позволяет им получать определенный ресурс – без использования их имени пользователя и пароля. Как только их токен будет получен, пользователь может предложить токен – который предлагает доступ к определенному ресурсу за период времени – к удаленному сайту.
Прочитайте больше
Теперь давайте посмотрим, какие шаги будут реализованы в вашем веб-сервисе REST.
Он будет использовать следующий поток контроля:
- Пользователь вводит имя пользователя и пароль в форме входа в систему и нажимает кнопку «Вход».
- После того, как запрос сделан, проверьте пользователя на бэкэнд путем запроса в базе данных. Если запрос действителен, создайте токен, используя информацию пользователя, полученную из базы данных, и затем верните эту информацию в заголовок ответа, чтобы мы могли хранить браузер маркера в локальном хранилище.
- Предоставление маркерной информации в каждом заголовке запроса для доступа к ограниченным конечным точкам в приложении.
- Если маркер, полученный из информации заголовка запроса, действителен, позвольте пользователю получить доступ к указанной конечной точке и ответить с помощью JSON или XML.
См. Изображение ниже для управления потоком
Вам может быть интересно, что такое JWT
JWT означает JSON Web Token и представляет собой формат токена, используемый в заголовках авторизации. Этот токен помогает безопасно конструировать связь между двумя системами. Давайте перефразируем JWT как «токен-носитель» для целей этого урока. Маркер-носитель состоит из трех частей: заголовок, полезная нагрузка и подпись.
- Заголовок является частью токена, который поддерживает тип маркера и метод шифрования, который также зашифровывается базой-64.
- Полезная нагрузка включает в себя информацию. Вы можете поместить любые данные, такие как информация о пользователе, информация о продукте и т. Д., Все из которых хранится с использованием шифрования base-64.
- Подпись состоит из комбинаций заголовка, полезной нагрузки и секретного ключа. Секретный ключ должен быть надежно сохранен на стороне сервера. Вы можете увидеть схему JWT и примерный токен ниже;
Вам не нужно реализовывать генератор токенов-носителей, поскольку вы можете использовать php-jwt .
Надеюсь, это объясняет ваше замешательство. если вы столкнетесь с любыми проблемами, связанными с аутентификацией на токенах, дайте мне знать. Я могу помочь тебе.