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

Куки и jwt токен как с этим работать?

У меня есть код, в котором при авторизации я записываю токен в БД и при переходе по страницам его проверяю.
$key = '3e85abb8c6a637267228c94b7f9c2564c68f976ba983837173545afa75b629d1';
$token = array(
'iat' => time(),
'nbf' => time(),
'exp' => time() + 3600,
'data' => array(
'user_id' => $user['id'],
'user_name' => $user['name'],
)
);

$encode = JWT::encode($token, $key, 'HS256');

$update_token_query = "UPDATE `users` SET `token` = '$encode' WHERE `id` = {$user['id']}";
if ($mysqli->query($update_token_query) === TRUE) {
setcookie("token", $encode, time() + 3600, "/", "", true, true); // Встановлення HTTPOnly куки
} else {
echo "Помилка при оновленні токену: " . $mysqli->error;
}

$mysqli->close();
$decode = JWT::decode($encode, new Key($key, 'HS256'));
echo $encode;
echo $decode->data->user_id; // Виведе 'stas'
echo $decode->data->user_name; // Виведе 'stanislav'
header('Location:welcome.php');
exit(); на след странице я его проверяю // require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$mysqli = new mysqli('localhost', 'root', '', 'register-bd');

if ($mysqli->connect_error) {
die('Помилка підключення до бази даних: ' . $mysqli->connect_error);
}

$result = $mysqli->query("SELECT token FROM users"); 
if ($result) {
$row = $result->fetch_assoc();
if ($row) {
$token = $row['token'];
echo $token;
$key = '3e85abb8c6a637267228c94b7f9c2564c68f976ba983837173545afa75b629d1';
try {
$decode = JWT::decode($token, new Key($key, 'HS256'));
echo $decode->data->user_id; 
echo $decode->data->user_name; 

$user_id_from_token = $decode->data->user_id;
$user_name_from_token = $decode->data->user_name;

$sql = "SELECT * FROM `users` WHERE `id` = '$user_id_from_token' AND `name` = '$user_name_from_token'";
$result = $mysqli->query($sql);

if ($result->num_rows > 0) {
echo 'данні співпали';
return, щоб продовжити виконання скрипта
} else {
echo 'данні не співпали';
}
} catch (Exception $e) {
echo 'Помилка декодування токену: ' . $e->getMessage();
}
} else {
echo "Рядок з токеном не знайдено";
}
} else {
echo "Помилка виконання запиту до бази даних: " . $mysqli->error;
}

$mysqli->close();
и далее идёт загрузка страницы и тд тп, но это лишние движения, как реализовать запись токена в куки? и проверку его на след страницах??? и я проверял этот учаток кода куки не работает вообще setcookie("token", $encode, time() + 3600, "/", "", true, true);
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Рабочий JWT в базе не хранится. Он отдаётся клиенту и предъявляется при каждом запросе к серверу. Защитой служит цифровая подпись токена (третий фрагмент), закрытый ключ которой известен только серверу, выдавшему токен.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы