Skip to content

Commit

Permalink
User refreshing
Browse files Browse the repository at this point in the history
  • Loading branch information
sztyup committed Jul 8, 2020
1 parent a4d4863 commit 7a6404b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 25 deletions.
49 changes: 37 additions & 12 deletions src/LAuth/AbstractProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use DateTime;
use Doctrine\ORM\EntityManager;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
Expand Down Expand Up @@ -61,13 +62,13 @@ public function redirect(): RedirectResponse
/**
* @throws InvalidStateException
*/
public function callback(): ?Account
public function callback(bool $forceRefresh = false): ?Account
{
$this->checkState();

$tokens = $this->getTokensFromCode($this->request->query->get('code'));

$providerUser = $this->getUserByAccessToken($tokens->accessToken);
$providerUser = $this->getUserByAccessToken($tokens->accessToken, $forceRefresh);

$account = $this->matchExistingAccount($providerUser);

Expand All @@ -88,17 +89,11 @@ public function callback(): ?Account
return $account;
}

public function refresh(Account $account): Account
public function refresh(Account $account, bool $forceRefresh = false): Account
{
if ($account->getRefreshToken() !== null) {
$tokenResponse = $this->getTokensFromRefreshToken($account->getRefreshToken());
} else {
$tokenResponse = null;
}

$providerUser = $this->getUserByAccessToken($tokenResponse->accessToken);
$providerUser = $this->getProviderUser($account);

$this->updateAccount($account, $providerUser, $tokenResponse);
$this->updateAccount($account, $providerUser, null);

$account->setUpdatedAt(new DateTime());

Expand All @@ -109,6 +104,36 @@ public function refresh(Account $account): Account
return $account;
}

public function getProviderUser(Account $account, bool $forceRefresh = false): ProviderUser
{
try {
return $this->getUserByAccessToken($account->getAccessToken(), $forceRefresh);
} catch (RequestException $exception) {
if ($exception->getResponse() && $exception->getResponse()->getStatusCode() === 401) {
$this->refreshTokens($account);

return $this->getUserByAccessToken($account->getAccessToken(), $forceRefresh);
}

throw $exception;
}
}

protected function refreshTokens(Account $account): void
{
if ($account->getRefreshToken() !== null) {
$tokenResponse = $this->getTokensFromRefreshToken($account->getRefreshToken());

if ($tokenResponse->accessToken !== null) {
$account->setAccessToken($tokenResponse->accessToken);
}

if ($tokenResponse->refreshToken !== null) {
$account->setRefreshToken($tokenResponse->refreshToken);
}
}
}

protected function matchExistingAccount(ProviderUser $providerUser): ?Account
{
$query = sprintf(
Expand Down Expand Up @@ -202,5 +227,5 @@ protected function parseTokenResponse(MessageInterface $response): TokenResponse
return $tokenResponse;
}

abstract protected function getUserByAccessToken(string $accessToken): ProviderUser;
abstract protected function getUserByAccessToken(string $accessToken, bool $forceRefresh = false): ProviderUser;
}
35 changes: 24 additions & 11 deletions src/LAuth/LAuth.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

declare(strict_types=1);

namespace Sztyup\LAuth;
Expand Down Expand Up @@ -37,10 +38,10 @@ public function __construct(
Repository $config,
ProviderRegistry $providerRegistry
) {
$this->em = $em;
$this->manager = $manager;
$this->dispatcher = $dispatcher;
$this->config = $config;
$this->em = $em;
$this->manager = $manager;
$this->dispatcher = $dispatcher;
$this->config = $config;
$this->providerRegistry = $providerRegistry;
}

Expand All @@ -51,11 +52,11 @@ public function redirectToProvider(string $providerName)
return $provider->redirect();
}

public function handleProviderCallback(string $providerName): ?User
public function handleProviderCallback(string $providerName, bool $forceRefresh = false): ?User
{
$provider = $this->providerRegistry->getProvider($providerName);

$account = $provider->callback();
$account = $provider->callback($forceRefresh);

if ($account === null) {
return null;
Expand All @@ -74,14 +75,26 @@ public function handleProviderCallback(string $providerName): ?User
return $user;
}

public function refreshAccount(Account $account): Account
public function refreshAccount(Account $account, bool $forceRefresh = false): Account
{
$map = $this->em->getClassMetadata(Account::class)->discriminatorMap;
$providerName = array_search(get_class($account), $map, true);
$provider = $this->getProviderForAccount($account);

$provider = $this->providerRegistry->getProvider($providerName);
return $provider->refresh($account, $forceRefresh);
}

public function getProviderUser(Account $account, bool $forceRefresh = false): ProviderUser
{
$provider = $this->getProviderForAccount($account);

return $provider->getProviderUser($account, $forceRefresh);
}

protected function getProviderForAccount(Account $account): ProviderInterface
{
$map = $this->em->getClassMetadata(Account::class)->discriminatorMap;
$providerName = array_search(get_class($account), $map, true);

return $provider->refresh($account);
return $this->providerRegistry->getProvider($providerName);
}

protected function getUserFromAccount(Account $socialAccount): User
Expand Down
6 changes: 4 additions & 2 deletions src/LAuth/ProviderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ public function getName(): string;

public function redirect(): RedirectResponse;

public function callback(): ?Account;
public function callback(bool $forceRefresh = false): ?Account;

public function refresh(Account $account): Account;
public function refresh(Account $account, bool $forceRefresh = false): Account;

public function getProviderUser(Account $account, bool $forceRefresh = false): ProviderUser;

public static function getEntitiesPath(): string;

Expand Down

0 comments on commit 7a6404b

Please sign in to comment.