<?php
namespace App\Service;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Config\Definition\Exception\Exception;
use Firebase\JWT\JWT;
use Firebase\JWT\ExpiredException;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class JwtService
{
private $logger;
private $timeout;
// Allow overriding cookie domain
public $domain;
private $server_url;
private $key;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
$this->timeout = $_ENV['JWT_TIMEOUT'];
$this->key = $_ENV['JWT_KEY'];
$this->timeForRefresh = time() + ($_ENV['JWT_TIMEOUT'] / 2); // if we have less than half the time left, refresh token
}
function setNewToken($userName, $roles, $timeout = null)
{
if (!$timeout) {
$timeout = $this->timeout;
}
$payload = [
"user" => $userName,
"roles" => $roles,
"exp" => time() + $timeout,
];
return JWT::encode($payload, $this->key);
}
function getDecodedToken($jwt)
{
return (array) JWT::decode(
$jwt,
$_ENV['JWT_KEY'],
['HS256']
);
}
public function getUser($jwt)
{
try {
if (!$jwt) {
throw new Exception('JWT not set.');
}
$decoded_jwt = $this->getDecodedToken($jwt);
if (!$decoded_jwt['user']) {
throw new Exception('User not set.');
}
} catch (ExpiredException $e) {
throw new Exception($e->getMessage());
}
return $decoded_jwt['user'];
}
public function setRefreshedJwt($jwt)
{
$jwt['exp'] = time() + $this->timeout;
return JWT::encode($jwt, $this->key);
}
}