Я попытался создать аутентификацию токена JWT API, используя ссылку
https://www.sitepoint.com/php-authorization-jwt-json-web-tokens/
Все работает отлично, но я сталкиваюсь с одной проблемой, то есть токен можно использовать повторно, пока не истечет срок его действия. Я проверил это по следующему сценарию
Создайте токен1 (токен jwt), используя имя пользователя и пароль. Время истечения 30 минут
Создайте другой токен из другого браузера или почтальона, т.е. token2 (токен JWT) через 10 минут после создания первого токена1 (использовались те же имя пользователя и пароль, что и токен1)
Проблема в том, что я могу использовать token1 и token2 для доступа к защищенному URL. Что мне нужно, так это то, что token1 нужно истечь (т.е. предыдущий токен для того же пользователя), если я вхожу с теми же данными пользователя.
Я полагаю, что токен нигде не сохранен, так как можно истечь действительный предыдущий токен для того же пользователя, если я попытался войти в систему.
Конечная точка аутентификации www.mysite.com/api/login.php
По коду успеха
$tokenId = base64_encode(openssl_random_pseudo_bytes(32));
$issuedAt = time();
$notBefore = $issuedAt -1;
$expire = $notBefore + 1500;
$serverName = $config->get('serverName');
$data = array(
'iat' => $issuedAt, // Issued at: time when the token was generated
'jti' => $tokenId, // Json Token Id: an unique identifier for the token
'iss' => $serverName, // Issuer
'nbf' => $notBefore, // Not before
'exp' => $expire, // Expire
'data' => array( // Data related to the signer user
'userId' => $uid, // userid from the users table
'userName' => $username, // User name
)
);
header('Content-type: application/json');
$secretKey = base64_decode($config->get('jwt')->get('key'));
$algorithm = $config->get('jwt')->get('algorithm');
$jwt = JWT::encode(
$data, //Data to be encoded in the JWT
$secretKey, // The signing key
$algorithm // Algorithm used to sign the token, see https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40#section-3
);
$unencodedArray = array('jwt' => $jwt,"success"=>true);
На каждом безопасном URL
list($jwt) = sscanf( $authHeader->toString(), 'Authorization: Baerer %s');
if ($jwt) {
try {
$config = Factory::fromFile('config/config.php', true);
$secretKey = base64_decode($config->get('jwt')->get('key'));
$token = JWT::decode($jwt, $secretKey, array('HS512'));
$asset = "test";
$response['success'] = true;
$sth = $db->prepare("SELECT * from users");
$sth->execute();
$datas = $sth->fetchAll(PDO::FETCH_ASSOC);
$response['datas'] = $datas;
header('Content-type: application/json');
echo json_encode($response);
} catch (Exception $e) {
//$response['success'] = false;
$response['message'] = "Warning Expired Auth: ".$e->getMessage();
echo json_encode($response);
}
Задача ещё не решена.
Других решений пока нет …