Задать вопрос
@Chesterfield25

Как правильно создать jwt авторизацию?

Я взял за пример это пособие всё в принципе работает но при тестирование возник вопрос. Когда отправляю пост запрос на страницу update_user.php данные и токен обновляется но и при повторных попытках обновить информацию старым токеном происходит успешно вопрос это такое пособие или в чем тогда защита и смысл обновления токена?

update_user.php

<?php

// Заголовки
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// Требуется для кодирования веб-токена JSON
include_once "./Config/Core.php";
include_once "./libs/php-jwt/BeforeValidException.php";
include_once "./libs/php-jwt/ExpiredException.php";
include_once "./libs/php-jwt/SignatureInvalidException.php";
include_once "./libs/php-jwt/JWT.php";
include_once "./libs/php-jwt/Key.php";

use \Firebase\JWT\JWT;
use \Firebase\JWT\Key;

// Файлы, необходимые для подключения к базе данных
include_once "./Config/Database.php";
include_once "./Objects/User.php";

// Получаем соединение с БД
$database = new Database();
$db = $database->getConnection();

// Создание объекта "User"
$user = new User($db);

// Получаем данные
$data = json_decode(file_get_contents("php://input"));

// Получаем jwt
$jwt = isset($data->jwt) ? $data->jwt : "";

// Если JWT не пуст
if ($jwt) {

    // Если декодирование выполнено успешно, показать данные пользователя
    try {

        // Декодирование jwt
        $decoded = JWT::decode($jwt, new Key($key, 'HS256'));

        // Нам нужно установить отправленные данные (через форму HTML) в свойствах объекта пользователя
        $user->login = $data->login;
        $user->email = $data->email;
        $user->password = $data->password;
        $user->id = $decoded->data->id;

        // Создание пользователя
        if ($user->update()) {
            // Нам нужно заново сгенерировать JWT, потому что данные пользователя могут отличаться
$token = array(
    "iss" => $iss,
    "aud" => $aud,
    "iat" => $iat,
    "nbf" => $nbf,
    "data" => array(
        "id" => $user->id,
        "login" => $user->login,
        "email" => $user->email
    )
 );
 
 $jwt = JWT::encode($token, $key, 'HS256');
  
 // Код ответа
 http_response_code(200);
  
 // Ответ в формате JSON
 echo json_encode(
     array(
         "message" => "Пользователь был обновлён",
         "jwt" => $jwt
     )
 );
        }

        // Сообщение, если не удается обновить пользователя
        else {

            // Код ответа
            http_response_code(401);

            // Показать сообщение об ошибке
            echo json_encode(array("message" => "Невозможно обновить пользователя"));
        }
    }

    // Если декодирование не удалось, это означает, что JWT является недействительным
    catch (Exception $e) {

        // Код ответа
        http_response_code(401);

        // Сообщение об ошибке
        echo json_encode(array(
            "message" => "Доступ закрыт",
            "error" => $e->getMessage()
        ));
    }
}

// Показать сообщение об ошибке, если jwt пуст
else {

    // Код ответа
    http_response_code(401);

    // Сообщить пользователю что доступ запрещен
    echo json_encode(array("message" => "Доступ закрыт"));
}
  • Вопрос задан
  • 642 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Это странный пример.
- За обновление токена и обновление данных обычно отвечают разные роуты, и делается это разными запросами.
- Генерация нового токена никак не инвалидирует старые. Для инвалидации можно использовать черные списки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽