diff --git a/config/services.yaml b/config/services.yaml index 2918537..2ddaf83 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -79,10 +79,6 @@ services: arguments: - '%env(APP_ENV)%' - App\Service\Auth\AuthService: - arguments: - - '%env(APP_SECRET)%' - App\Service\LocalizationService: arguments: - '%kernel.default_locale%' diff --git a/src/ApiResource/User/UserTokenApiResource.php b/src/ApiResource/User/UserTokenApiResource.php deleted file mode 100644 index 062e65e..0000000 --- a/src/ApiResource/User/UserTokenApiResource.php +++ /dev/null @@ -1,44 +0,0 @@ -identifier = $identifier; - $this->password = $password; - } -} diff --git a/src/Entity/User/User.php b/src/Entity/User/User.php index cffc45f..b4ee235 100644 --- a/src/Entity/User/User.php +++ b/src/Entity/User/User.php @@ -72,12 +72,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, Account #[ORM\OneToMany(mappedBy: 'owner', targetEntity: Project::class, cascade: ['persist'])] private Collection $projects; - /** - * The UserTokens owned by this User. Owner only property. - */ - #[ORM\OneToMany(mappedBy: 'owner', targetEntity: UserToken::class, orphanRemoval: true)] - private Collection $tokens; - #[ORM\OneToOne(mappedBy: 'user', cascade: ['persist', 'remove'])] private ?Person $person = null; @@ -128,7 +122,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, Account $this->accounting = Accounting::of($this); $this->projects = new ArrayCollection(); - $this->tokens = new ArrayCollection(); $this->person = Person::for($this); $this->emailConfirmed = false; @@ -236,36 +229,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, Account return $this; } - /** - * @return Collection - */ - public function getTokens(): Collection - { - return $this->tokens; - } - - public function addToken(UserToken $token): static - { - if (!$this->tokens->contains($token)) { - $this->tokens->add($token); - $token->setOwner($this); - } - - return $this; - } - - public function removeToken(UserToken $token): static - { - if ($this->tokens->removeElement($token)) { - // set the owning side to null (unless already changed) - if ($token->getOwner() === $this) { - $token->setOwner(null); - } - } - - return $this; - } - public function getPerson(): ?Person { return $this->person; diff --git a/src/Entity/User/UserToken.php b/src/Entity/User/UserToken.php deleted file mode 100644 index 069c1d4..0000000 --- a/src/Entity/User/UserToken.php +++ /dev/null @@ -1,63 +0,0 @@ -id; - } - - public function getToken(): ?string - { - return $this->token; - } - - public function setToken(string $token): static - { - $this->token = $token; - - return $this; - } -} diff --git a/src/EventSubscriber/AuthorizationTokenSubscriber.php b/src/EventSubscriber/AuthorizationTokenSubscriber.php deleted file mode 100644 index e9a11a4..0000000 --- a/src/EventSubscriber/AuthorizationTokenSubscriber.php +++ /dev/null @@ -1,63 +0,0 @@ - ['onView', EventPriorities::POST_WRITE], - KernelEvents::RESPONSE => ['onResponse', EventPriorities::POST_RESPOND], - ]; - } - - public function onView(ViewEvent $event): void - { - $resourceClass = $event->getRequest()->attributes->get('_api_resource_class'); - - if ($resourceClass !== UserTokenApiResource::class) { - return; - } - - $event->getRequest()->attributes->set('authTokenMethod', $event->getRequest()->getMethod()); - - if ($event->getRequest()->getMethod() === Request::METHOD_POST) { - $token = $event->getControllerResult(); - - $event->getRequest()->attributes->set('authTokenValue', $token->token); - } - } - - public function onResponse(ResponseEvent $event): void - { - $token = $event->getRequest()->attributes->get('authTokenValue'); - $method = $event->getRequest()->attributes->get('authTokenMethod'); - - if (!$method) { - return; - } - - switch ($method) { - case Request::METHOD_DELETE: - $event->getResponse()->headers->clearCookie(AuthService::AUTH_COOKIE_NAME); - break; - case Request::METHOD_POST: - $event->getResponse()->headers->setCookie($this->authService->generateCookie($token)); - break; - } - } -} diff --git a/src/OpenApi/RedocExtensionsTrait.php b/src/OpenApi/RedocExtensionsTrait.php index f4d2d01..44866dd 100644 --- a/src/OpenApi/RedocExtensionsTrait.php +++ b/src/OpenApi/RedocExtensionsTrait.php @@ -23,7 +23,6 @@ trait RedocExtensionsTrait 'name' => 'Users', 'tags' => [ 'User', - 'UserToken', 'Person', 'Organization', ], diff --git a/src/Repository/User/UserTokenRepository.php b/src/Repository/User/UserTokenRepository.php deleted file mode 100644 index 5892bd5..0000000 --- a/src/Repository/User/UserTokenRepository.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * @method UserToken|null find($id, $lockMode = null, $lockVersion = null) - * @method UserToken|null findOneBy(array $criteria, array $orderBy = null) - * @method UserToken[] findAll() - * @method UserToken[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) - */ -class UserTokenRepository extends ServiceEntityRepository -{ - public function __construct(ManagerRegistry $registry) - { - parent::__construct($registry, UserToken::class); - } - - // /** - // * @return UserToken[] Returns an array of UserToken objects - // */ - // public function findByExampleField($value): array - // { - // return $this->createQueryBuilder('a') - // ->andWhere('a.exampleField = :val') - // ->setParameter('val', $value) - // ->orderBy('a.id', 'ASC') - // ->setMaxResults(10) - // ->getQuery() - // ->getResult() - // ; - // } - - // public function findOneBySomeField($value): ?UserToken - // { - // return $this->createQueryBuilder('a') - // ->andWhere('a.exampleField = :val') - // ->setParameter('val', $value) - // ->getQuery() - // ->getOneOrNullResult() - // ; - // } -} diff --git a/src/Security/AccessTokenHandler.php b/src/Security/AccessTokenHandler.php deleted file mode 100644 index efb7e30..0000000 --- a/src/Security/AccessTokenHandler.php +++ /dev/null @@ -1,24 +0,0 @@ -userTokenRepository->findOneBy(['token' => $accessToken]); - - if (!$token) { - throw new BadCredentialsException(); - } - - return new UserBadge($token->getOwner()->getUserIdentifier()); - } -} diff --git a/src/Security/CookieAuthenticator.php b/src/Security/CookieAuthenticator.php deleted file mode 100644 index 7e8e91f..0000000 --- a/src/Security/CookieAuthenticator.php +++ /dev/null @@ -1,56 +0,0 @@ -cookies->has(AuthService::AUTH_COOKIE_NAME); - } - - public function authenticate(Request $request): Passport - { - $token = $request->cookies->get(AuthService::AUTH_COOKIE_NAME); - - if (!$token) { - throw new AuthenticationException(); - } - - return new SelfValidatingPassport($this->accessTokenHandler->getUserBadgeFrom($token)); - } - - public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response - { - return null; - } - - public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response - { - return new JsonResponse([ - 'message' => strtr($exception->getMessageKey(), $exception->getMessageData()), - ], Response::HTTP_UNAUTHORIZED); - } -} diff --git a/src/Service/Auth/AuthService.php b/src/Service/Auth/AuthService.php deleted file mode 100644 index 0a17a9a..0000000 --- a/src/Service/Auth/AuthService.php +++ /dev/null @@ -1,82 +0,0 @@ -config; - } - - private function getCookieTtl(): \DateTimeInterface - { - return (new \DateTime())->add(new \DateInterval(\sprintf('PT%dS', AuthService::AUTH_COOKIE_TTL))); - } - - public function generateCookie(string $token): Cookie - { - return new Cookie( - name: AuthService::AUTH_COOKIE_NAME, - value: $token, - expire: $this->getCookieTtl(), - path: '/', - secure: true, - httpOnly: true, - sameSite: 'Strict' - ); - } - - public function generateUserToken(User $user, AuthTokenType $type): UserToken - { - $token = new UserToken(); - - $token->setOwner($user); - $token->setToken(sprintf('%s%s', $type->value, hash( - self::TOKEN_HASH_ALGO, - join('', [ - microtime(true), - $this->appSecret, - random_bytes(32), - $user->getUserIdentifier(), - ]) - ))); - - return $token; - } - - public function getUser(): ?User - { - $loggedInUser = $this->security->getUser(); - - if (!$loggedInUser) { - return null; - } - - return $this->userRepository->findOneBy( - ['handle' => $loggedInUser->getUserIdentifier()] - ); - } -} diff --git a/src/State/Project/ProjectStateProcessor.php b/src/State/Project/ProjectStateProcessor.php index 7ba03b3..53cd38b 100644 --- a/src/State/Project/ProjectStateProcessor.php +++ b/src/State/Project/ProjectStateProcessor.php @@ -10,8 +10,8 @@ use App\Dto\ProjectUpdationDto; use App\Entity\Project\Project; use App\Entity\Project\ProjectCalendar; use App\Mapping\AutoMapper; -use App\Service\Auth\AuthService; use App\State\EntityStateProcessor; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Exception\AuthenticationException; class ProjectStateProcessor implements ProcessorInterface @@ -19,7 +19,7 @@ class ProjectStateProcessor implements ProcessorInterface public function __construct( private EntityStateProcessor $entityStateProcessor, private AutoMapper $autoMapper, - private AuthService $authService, + private Security $security, ) {} /** @@ -52,7 +52,7 @@ class ProjectStateProcessor implements ProcessorInterface /** @var Project */ $project = $this->autoMapper->map($data, Project::class); - $owner = $this->authService->getUser(); + $owner = $this->security->getUser(); if (!$owner) { throw new AuthenticationException(); diff --git a/src/State/Project/RewardClaimStateProcessor.php b/src/State/Project/RewardClaimStateProcessor.php index 15ce788..e73fe24 100644 --- a/src/State/Project/RewardClaimStateProcessor.php +++ b/src/State/Project/RewardClaimStateProcessor.php @@ -8,8 +8,8 @@ use App\ApiResource\Project\RewardClaimApiResource; use App\Dto\RewardClaimCreationDto; use App\Entity\Project\RewardClaim; use App\Mapping\AutoMapper; -use App\Service\Auth\AuthService; use App\State\EntityStateProcessor; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Exception\AuthenticationException; class RewardClaimStateProcessor implements ProcessorInterface @@ -17,7 +17,7 @@ class RewardClaimStateProcessor implements ProcessorInterface public function __construct( private EntityStateProcessor $entityStateProcessor, private AutoMapper $autoMapper, - private AuthService $authService, + private Security $security, ) {} /** @@ -31,7 +31,7 @@ class RewardClaimStateProcessor implements ProcessorInterface $claim = $this->autoMapper->map($data, RewardClaim::class); if ($data instanceof RewardClaimCreationDto) { - $owner = $this->authService->getUser(); + $owner = $this->security->getUser(); if (!$owner) { throw new AuthenticationException(); diff --git a/src/State/Project/SupportStateProcessor.php b/src/State/Project/SupportStateProcessor.php index 9276961..c241149 100644 --- a/src/State/Project/SupportStateProcessor.php +++ b/src/State/Project/SupportStateProcessor.php @@ -7,16 +7,16 @@ use ApiPlatform\State\ProcessorInterface; use App\ApiResource\Project\SupportApiResource; use App\Entity\Project\Support; use App\Mapping\AutoMapper; -use App\Service\Auth\AuthService; use App\State\EntityStateProcessor; use Doctrine\ORM\EntityManagerInterface; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Exception\AuthenticationException; class SupportStateProcessor implements ProcessorInterface { public function __construct( private EntityStateProcessor $entityStateProcessor, - private AuthService $authService, + private Security $security, private AutoMapper $autoMapper, private EntityManagerInterface $entityManager, ) {} @@ -28,7 +28,8 @@ class SupportStateProcessor implements ProcessorInterface */ public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []) { - $user = $this->authService->getUser(); + $user = $this->security->getUser(); + if (!$user) { throw new AuthenticationException(); } diff --git a/src/State/Project/UpdateStateProcessor.php b/src/State/Project/UpdateStateProcessor.php index 459e468..6611cb5 100644 --- a/src/State/Project/UpdateStateProcessor.php +++ b/src/State/Project/UpdateStateProcessor.php @@ -7,8 +7,8 @@ use ApiPlatform\State\ProcessorInterface; use App\ApiResource\Project\UpdateApiResource; use App\Entity\Project\Update; use App\Mapping\AutoMapper; -use App\Service\Auth\AuthService; use App\State\EntityStateProcessor; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Exception\AuthenticationException; class UpdateStateProcessor implements ProcessorInterface @@ -16,7 +16,7 @@ class UpdateStateProcessor implements ProcessorInterface public function __construct( private EntityStateProcessor $entityStateProcessor, private AutoMapper $autoMapper, - private AuthService $authService, + private Security $security, ) {} /** @@ -29,7 +29,8 @@ class UpdateStateProcessor implements ProcessorInterface /** @var Update */ $update = $this->autoMapper->map($data, Update::class); - $user = $this->authService->getUser(); + $user = $this->security->getUser(); + if (!$user) { throw new AuthenticationException(); } diff --git a/src/State/User/UserTokenLoginProcessor.php b/src/State/User/UserTokenLoginProcessor.php deleted file mode 100644 index 85a285a..0000000 --- a/src/State/User/UserTokenLoginProcessor.php +++ /dev/null @@ -1,52 +0,0 @@ -userRepository->findOneByIdentifier($data->identifier); - - if (!$user) { - throw new HttpException(Response::HTTP_NOT_FOUND, sprintf("The user '%s' does not exist.", $data->identifier)); - } - - if (!$this->userPasswordHasher->isPasswordValid($user, $data->password)) { - throw new HttpException(Response::HTTP_UNAUTHORIZED, sprintf('The password could not be validated')); - } - - $token = $this->authService->generateUserToken($user, AuthTokenType::Personal); - - $this->entityManager->persist($token); - $this->entityManager->flush(); - - return $this->autoMapper->map($token, UserTokenApiResource::class); - } -}