@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);
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Рабочий JWT в базе не хранится. Он отдаётся клиенту и предъявляется при каждом запросе к серверу. Защитой служит цифровая подпись токена (третий фрагмент), закрытый ключ которой известен только серверу, выдавшему токен.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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