src/Entity/AccessToken.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\AccessTokenRepository;
  4. use Doctrine\ORM\Mapping as ORM;
  5. use Symfony\Component\HttpFoundation\Cookie;
  6. /**
  7.  * @ORM\Entity(repositoryClass=AccessTokenRepository::class)
  8.  */
  9. class AccessToken
  10. {
  11.     const TOKEN_EXPIRATION_MINUTES 5;
  12.     /**
  13.      * @ORM\Id
  14.      * @ORM\GeneratedValue
  15.      * @ORM\Column(type="integer")
  16.      */
  17.     private $id;
  18.     /**
  19.      * @ORM\Column(type="datetime")
  20.      */
  21.     private $createdAt;
  22.     /**
  23.      * @ORM\ManyToOne(targetEntity=Device::class, inversedBy="accessTokens")
  24.      */
  25.     private $device;
  26.     /**
  27.      * @ORM\Column(type="string", length=255, unique=true)
  28.      */
  29.     private $token;
  30.     /**
  31.      * @ORM\Column(type="boolean", nullable=true)
  32.      */
  33.     private $revoked;
  34.     /**
  35.      * @ORM\OneToOne(targetEntity=RefreshToken::class, cascade={"persist", "remove"})
  36.      */
  37.     private $refreshToken;
  38.     /**
  39.      * @ORM\ManyToOne(targetEntity=User::class)
  40.      * @ORM\JoinColumn(nullable=false)
  41.      */
  42.     private $user;
  43.     /**
  44.      * @ORM\Column(type="boolean", nullable=true)
  45.      */
  46.     private $permanent;
  47.     public function __construct()
  48.     {
  49.         $this->createdAt = new \DateTime();
  50.     }
  51.     public function __toString()
  52.     {
  53.         return $this->getUser()->getName() . ' - ' $this->getDevice()->getName() . ' - ' $this->getToken()
  54.             . ' - ' . ($this->isRevoked() ? 'revoked' 'active')
  55.             . ' - ' . ($this->isExpired() ? 'expired' 'valid')
  56.             . ' - ' . ($this->isPermanent() ? 'permanent' 'temporary')
  57.             . ' - ' . ($this->isRefreshable() ? 'refreshable' 'not refreshable');
  58.     }
  59.     public function getId(): ?int
  60.     {
  61.         return $this->id;
  62.     }
  63.     public function getCreatedAt(): ?\DateTimeInterface
  64.     {
  65.         return $this->createdAt;
  66.     }
  67.     public function setCreatedAt(\DateTimeInterface $createdAt): self
  68.     {
  69.         $this->createdAt $createdAt;
  70.         return $this;
  71.     }
  72.     public function getDevice(): ?Device
  73.     {
  74.         return $this->device;
  75.     }
  76.     public function setDevice(?Device $device): self
  77.     {
  78.         $this->device $device;
  79.         return $this;
  80.     }
  81.     public function getToken(): ?string
  82.     {
  83.         return $this->token;
  84.     }
  85.     public function setToken(string $token): self
  86.     {
  87.         $this->token $token;
  88.         return $this;
  89.     }
  90.     public function getExpiresAt(): ?\DateTimeInterface
  91.     {
  92.         if ($this->getCreatedAt()) {
  93.             $expiresAt = clone $this->getCreatedAt();
  94.             $expiresAt->modify('+' self::TOKEN_EXPIRATION_MINUTES ' minutes');
  95.             return $expiresAt;
  96.         }
  97.         return null;
  98.     }
  99.     public function isExpired(): bool
  100.     {
  101.         $expiresAt $this->getExpiresAt();
  102.         if ($expiresAt) {
  103.             return new \DateTime() > $expiresAt;
  104.         }
  105.         return false;
  106.     }
  107.     public function isRevoked(): ?bool
  108.     {
  109.         return $this->revoked;
  110.     }
  111.     public function setRevoked(?bool $revoked): self
  112.     {
  113.         $this->revoked $revoked;
  114.         return $this;
  115.     }
  116.     public function isAlive(): bool
  117.     {
  118.         return $this->isPermanent() || (!$this->isExpired() && !$this->isRevoked());
  119.     }
  120.     public function getRefreshToken(): ?RefreshToken
  121.     {
  122.         return $this->refreshToken;
  123.     }
  124.     public function setRefreshToken(?RefreshToken $refreshToken): self
  125.     {
  126.         $this->refreshToken $refreshToken;
  127.         return $this;
  128.     }
  129.     public function getUser(): ?User
  130.     {
  131.         return $this->user;
  132.     }
  133.     public function setUser(?User $user): self
  134.     {
  135.         $this->user $user;
  136.         return $this;
  137.     }
  138.     public function isRefreshable(): bool
  139.     {
  140.         return $this->getRefreshToken() && $this->getRefreshToken()->isAlive();
  141.     }
  142.     public function createCookie()
  143.     {
  144.         return Cookie::create('access_token')
  145.             ->withValue($this->getToken())
  146.             ->withHttpOnly(true)
  147.             ->withSecure($_ENV["APP_ENV"] == "prod"// true in production with HTTPS //todo redo
  148.             ->withSameSite('Lax')
  149.             ->withPath('/1bc3f6fdaea8f6ae35')
  150.             ->withExpires((new \DateTime())->modify('+365 days'))
  151.         ;
  152.     }
  153.     public function isPermanent(): ?bool
  154.     {
  155.         return $this->permanent;
  156.     }
  157.     public function setPermanent(?bool $permanent): self
  158.     {
  159.         $this->permanent $permanent;
  160.         return $this;
  161.     }
  162. }