Skip to content

Commit

Permalink
Dont create new token on auth (#55)
Browse files Browse the repository at this point in the history
  • Loading branch information
yatsenkolesh authored Sep 3, 2024
1 parent 228b9d4 commit 4af3a68
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 13 deletions.
33 changes: 30 additions & 3 deletions Modules/Auth/Entities/AccessToken/AccessToken.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,41 @@ class AccessToken
*/
private $accessToken;

public function __construct(PersonalAccessTokenResult $accessToken)
{
private ?string $tokenString = null;

private ?string $expiresAt = null;

private ?string $entityId = null;

public function __construct(
?PersonalAccessTokenResult $accessToken,
?string $token = null,
?string $expiresAt = null,
?string $entityId = null
) {
$this->accessToken = $accessToken;
if ($token) {
$this->tokenString = $token;
}
if ($expiresAt) {
$this->expiresAt = $expiresAt;
}
if ($entityId) {
$this->entityId = $entityId;
}
}

public function getToken(): string
{
return $this->accessToken->accessToken;
return $this->tokenString ?? $this->accessToken->accessToken;
}

public function expiresAt(): string
{
if ($this->expiresAt) {
return $this->expiresAt;
}

/**
* @var Carbon $expiresAt
*/
Expand All @@ -35,6 +58,10 @@ public function expiresAt(): string

public function getEntityId(): string
{
if ($this->entityId) {
return $this->entityId;
}

return $this->accessToken->token->getAttribute('id');
}

Expand Down
11 changes: 8 additions & 3 deletions Modules/Auth/Services/Auth/Authenticator.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,14 @@ class Authenticator
*/
private $userRepository;

public function __construct(UserRepository $userRepository)
{
private JwtGetterByUserService $jwtGetterByUserService;

public function __construct(
UserRepository $userRepository,
JwtGetterByUserService $jwtGetterByUserService
) {
$this->userRepository = $userRepository;
$this->jwtGetterByUserService = $jwtGetterByUserService;
}

/**
Expand All @@ -37,7 +42,7 @@ public function auth(AuthRequestDTO $authRequestDTO): UserWithAccessToken

return new UserWithAccessToken(
$user,
new AccessToken($user->createToken('default')),
$this->jwtGetterByUserService->getByUser($user),
false
);
}
Expand Down
12 changes: 9 additions & 3 deletions Modules/Auth/Services/Auth/AuthenticatorWithGoogle.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@ class AuthenticatorWithGoogle
*/
private $password;

public function __construct(UserRepository $userRepository, CreateRandomPassword $password)
{
private JwtGetterByUserService $jwtGetterByUserService;

public function __construct(
UserRepository $userRepository,
CreateRandomPassword $password,
JwtGetterByUserService $jwtGetterByUserService
) {
$this->userRepository = $userRepository;
$this->password = $password;
$this->jwtGetterByUserService = $jwtGetterByUserService;
}

/**
Expand Down Expand Up @@ -56,7 +62,7 @@ public function authOrCreate(GooglePayloadDTO $googlePayloadDTO): UserWithAccess

return new UserWithAccessToken(
$user,
new AccessToken($user->createToken('default')),
$this->jwtGetterByUserService->getByUser($user),
$isNew
);
}
Expand Down
70 changes: 70 additions & 0 deletions Modules/Auth/Services/Auth/JwtGetterByUserService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);

namespace Modules\Auth\Services\Auth;

use Carbon\Carbon;
use Laravel\Passport\Bridge\AccessToken;
use Laravel\Passport\Bridge\Client;
use League\OAuth2\Server\CryptKey;
use League\OAuth2\Server\Entities\ClientEntityInterface;
use Modules\Auth\Entities\AccessToken\AccessToken as AccessTokenEntity;
use Modules\Auth\Models\User\User;
use Laravel\Passport\Token;

class JwtGetterByUserService
{
private function getNewToken(
ClientEntityInterface $clientEntity,
array $scopes,
$userIdentifier = null
) {
$obj = (new AccessToken($userIdentifier, $scopes, $clientEntity));
$obj
->setExpiryDateTime(new \DateTimeImmutable());
$obj->setUserIdentifier($userIdentifier);

return $obj;
}

public function getByUser(User $user, ?Token $token = null): AccessTokenEntity
{
if (!$token) {
/**
* @var Token $token
*/
$token = $user->tokens()->orderByDesc('id')->first();
if (!$token) {
return new AccessTokenEntity($user->createToken('default'));
}
}

/**
* @var \Laravel\Passport\Client $client
*/
$client = $token->client()->first();
$jwt = $this->getNewToken(new Client(
$client->id,
$client->name,
$client->redirect,
true
), [], $user->id);

$jwt->setPrivateKey(new CryptKey(file_get_contents('/app/storage/oauth-private.key')));
$jwt->initJwtConfiguration();
$jwt->setIdentifier($token->id);
$jwt = (string) $jwt;

/**
* @var Carbon $expires
*/
$expires = $token->getAttribute('expires_at');

return new AccessTokenEntity(
null,
$jwt,
$expires->toDateTimeString(),
$token->id
);
}
}
13 changes: 9 additions & 4 deletions Modules/Auth/Services/Auth/ShortTokenAuthorizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,15 @@ class ShortTokenAuthorizer
* @var TokenRepository
*/
private $tokenRepository;

public function __construct(TokenRepository $repository)
{

private JwtGetterByUserService $jwtGetterByUserService;

public function __construct(
TokenRepository $repository,
JwtGetterByUserService $jwtGetterByUserService
) {
$this->tokenRepository = $repository;
$this->jwtGetterByUserService = $jwtGetterByUserService;
}

public function authorize(?string $token): ?UserWithAccessToken
Expand Down Expand Up @@ -50,7 +55,7 @@ public function authorize(?string $token): ?UserWithAccessToken

$bearer = new UserWithAccessToken(
$user,
new AccessToken($user->createToken('default')),
$this->jwtGetterByUserService->getByUser($user, $token),
false
);
return $bearer;
Expand Down

0 comments on commit 4af3a68

Please sign in to comment.