Как безопасно реализовать «Аутентификацию на основе токенов» для доступа к ресурсам сайта (т. Е. Функциям и данным), разработанным в 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

Я прав?

Благодарю.

23

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Вам не нужно реализовывать генератор токенов на предъявителя, так как вы можете использовать PHP-JWT.

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

73

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]