@wedytd

Почему неправильно работает авторизация через jwt токен?

Имеем rest api, при авторизации /api/user-login токен генерируется без ошибок авторизации, с использованием того же токена в /api/user-profile проходит без проблем. При использовании токена в методе /api/forum-new-message ошибка что токен якобы неверный. Я убрал этот код и выяснилось что возникает ошибка при расшифровке токена но почему? Код везде одинаковый, методы разные. Uncaught UnexpectedValueException: Wrong number of segments
<?php
require $_SERVER['DOCUMENT_ROOT'].'/engine/core.php';
use RedBeanPHP\R;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $token = htmlspecialchars($_POST['token']);
    if(empty($token)){
        echo json_encode(['status' => 'error', 'message' => 'Токен не может быть пустым!']);
    }
    $key = $_ENV['SECRET_KEY'];

    try {
        $decoded = JWT::decode($token, new Key($key, 'HS256'));
        $userId = $decoded->userId;
        $user = R::load('users', $userId);
        $userData = [
            'nickname' => $user->nickname,
            'email' => $user->email,
            'status' => $user->status,
            'register_date' => $user->register_date
        ];
        echo json_encode(['status' => 'success', 'data' => $userData]);
    } catch (ExpiredException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Токен устарел!']);
    } catch (SignatureInvalidException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Неверная подпись токена!']);
    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => 'Неверный токен!']);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'Метод не поддерживается!'], JSON_UNESCAPED_UNICODE);
}


<?php
require $_SERVER['DOCUMENT_ROOT'].'/engine/core.php';
use RedBeanPHP\R;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $token = htmlspecialchars(isset($_POST['token']));
    $message = htmlspecialchars(isset($_POST['message']));
    $subtopic_id = intval(isset($_POST['subtopic_id']));
    if(empty($token) || empty($message) || empty($subtopic_id)){
        echo json_encode(['status' => 'error', 'message' => 'Заполните все поля!']);
        exit;
    }
    $key = $_ENV['SECRET_KEY'];

    //try {
        $decoded = JWT::decode($token, new Key($key, 'HS256')); //Тут ошибка
        $userId = $decoded->userId;
        $subtopic = R::load('forum_subtopics', $subtopic_id);
        if (!$subtopic) {
            echo json_encode(['status' => 'error', 'message' => 'Подтема не найдена!']);
            exit;
        }
        $newMessage = R::dispense('forum_messages');
        $newMessage->subtopic_id = $subtopic_id;
        $newMessage->message = $message;
        $newMessage->user_id = $userId;
        $messageId = R::store($newMessage);
        echo json_encode(['status' => 'success', 'message' => 'Сообщение опубликовано!']);
    /*
    } catch (ExpiredException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Токен устарел!']);
    } catch (SignatureInvalidException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Неверная подпись токена!']);
    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => 'Неверный токен!']);
    }
    */
} else {
    echo json_encode(['status' => 'error', 'message' => 'Метод не поддерживается!'], JSON_UNESCAPED_UNICODE);
}
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
$token = htmlspecialchars(isset($_POST['token']));
$message = htmlspecialchars(isset($_POST['message']));
$subtopic_id = intval(isset($_POST['subtopic_id']));

превращают переданные значения в string/int "1" или "0" так как результат isset() - bool

корректный вариант скорее всего такой
<?php
$token = htmlspecialchars($_POST['token'] ?? '');
$message = htmlspecialchars($_POST['message'] ?? '');
$subtopic_id = intval($_POST['subtopic_id'] ?? 0);


чтобы понять где ошибка достаточно было посмотреть значение $token которое попадает в JWT::decode и там бы увидели "1" вместо переданного токена.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы