|
|
@ -25,12 +25,13 @@ namespace vierbergenlars\AuthserverOAuthAccountBundle\Security\Core\User; |
|
|
|
use App\Entity\User; |
|
|
|
use App\Entity\User; |
|
|
|
use App\Security\User\UserProvider; |
|
|
|
use App\Security\User\UserProvider; |
|
|
|
use Doctrine\Common\Persistence\ManagerRegistry; |
|
|
|
use Doctrine\Common\Persistence\ManagerRegistry; |
|
|
|
|
|
|
|
use Symfony\Component\Security\Core\User\UserInterface; |
|
|
|
|
|
|
|
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface; |
|
|
|
use HWI\Bundle\OAuthBundle\Connect\AccountConnectorInterface; |
|
|
|
use HWI\Bundle\OAuthBundle\Connect\AccountConnectorInterface; |
|
|
|
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface; |
|
|
|
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface; |
|
|
|
use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotLinkedException; |
|
|
|
use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotLinkedException; |
|
|
|
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface; |
|
|
|
|
|
|
|
use Symfony\Component\Security\Core\User\UserInterface; |
|
|
|
|
|
|
|
use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; |
|
|
|
use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; |
|
|
|
|
|
|
|
use vierbergenlars\AuthserverExternalAccountBundle\Entity\TemporaryUser; |
|
|
|
|
|
|
|
|
|
|
|
class OAuthUserProvider extends UserProvider implements OAuthAwareUserProviderInterface, AccountConnectorInterface |
|
|
|
class OAuthUserProvider extends UserProvider implements OAuthAwareUserProviderInterface, AccountConnectorInterface |
|
|
|
{ |
|
|
|
{ |
|
|
@ -57,24 +58,39 @@ class OAuthUserProvider extends UserProvider implements OAuthAwareUserProviderIn |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function loadUserByOAuthUserResponse(UserResponseInterface $response) |
|
|
|
public function loadUserByOAuthUserResponse(UserResponseInterface $response) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return $this->getExternalAccount($response)->getUser(); |
|
|
|
try { |
|
|
|
|
|
|
|
return $this->getExternalAccount($response)->getUser(); |
|
|
|
|
|
|
|
} catch (AccountNotLinkedException $ex) { |
|
|
|
|
|
|
|
$user = new TemporaryUser(); |
|
|
|
|
|
|
|
$externalUser = $this->createExternalUser($response); |
|
|
|
|
|
|
|
$user->setExternalUser($externalUser); |
|
|
|
|
|
|
|
return $user; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function createExternalUser(UserResponseInterface $response) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$externalUser = new ExternalUser(); |
|
|
|
|
|
|
|
$externalUser->setProvider('oauth_' . $response->getResourceOwner() |
|
|
|
|
|
|
|
->getName()); |
|
|
|
|
|
|
|
$externalUser->setProviderRef($response->getUsername()); |
|
|
|
|
|
|
|
$externalUser->setProviderFriendlyName($response->getRealName()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $externalUser; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function connect(UserInterface $user, UserResponseInterface $response) |
|
|
|
public function connect(UserInterface $user, UserResponseInterface $response) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if(!$user instanceof User) |
|
|
|
if (!$user instanceof User) |
|
|
|
throw new \UnexpectedValueException('User must be instance of '.User::class.', got '.get_class($username)); |
|
|
|
throw new \UnexpectedValueException('User must be instance of ' . User::class . ', got ' . get_class($user)); |
|
|
|
try { |
|
|
|
try { |
|
|
|
$externalUser = $this->getExternalAccount($response); |
|
|
|
$externalUser = $this->getExternalAccount($response); |
|
|
|
$this->disconnect($externalUser); |
|
|
|
$this->disconnect($externalUser); |
|
|
|
} catch(AccountNotLinkedException $ex) { |
|
|
|
} catch (AccountNotLinkedException $ex) { |
|
|
|
// do nothing |
|
|
|
// do nothing |
|
|
|
} |
|
|
|
} |
|
|
|
$externalUser = new ExternalUser(); |
|
|
|
$externalUser = $this->createExternalUser($response); |
|
|
|
$externalUser->setUser($user); |
|
|
|
$externalUser->setUser($user); |
|
|
|
$externalUser->setProvider('oauth_'.$response->getResourceOwner()->getName()); |
|
|
|
|
|
|
|
$externalUser->setProviderRef($response->getUsername()); |
|
|
|
|
|
|
|
$externalUser->setProviderFriendlyName($response->getRealName()); |
|
|
|
|
|
|
|
$this->getManager()->persist($externalUser); |
|
|
|
$this->getManager()->persist($externalUser); |
|
|
|
$this->getManager()->flush(); |
|
|
|
$this->getManager()->flush(); |
|
|
|
} |
|
|
|
} |
|
|
|