feat: oauth2 login via myep
This commit is contained in:
1 parent
078ef8b9a6
commit
898a7c7505
12 files changed
+384
-2
No files matched your search
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Security\OAuth2;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
class AuthorizationRequestException extends \Exception
|
||||
{
|
||||
private Request $request;
|
||||
|
||||
public function __construct($message, $code, $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
|
||||
public function getRequest(): Request
|
||||
{
|
||||
return $this->request;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Security\OAuth2;
|
||||
|
||||
use League\OAuth2\Client\Provider\AbstractProvider;
|
||||
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
|
||||
use League\OAuth2\Client\Provider\GenericProvider;
|
||||
use League\OAuth2\Client\Token\AccessTokenInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
|
||||
class MyEpClient
|
||||
{
|
||||
private array $config;
|
||||
|
||||
public function __construct(private readonly UrlGeneratorInterface $urlGenerator, array $options)
|
||||
{
|
||||
$this->config = $this->resolveConfig($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IdentityProviderException
|
||||
* @throws AuthorizationRequestException
|
||||
*/
|
||||
public function fetchAccessToken(Request $request): AccessTokenInterface
|
||||
{
|
||||
if (null === $code = $request->query->get('code')) {
|
||||
throw new AuthorizationRequestException('Missing code', 400, $request);
|
||||
}
|
||||
|
||||
$session = $request->getSession();
|
||||
|
||||
if (
|
||||
null === $request->query->get('state')
|
||||
|| $request->query->get('state') !== $session->get('oauth2state')
|
||||
) {
|
||||
$session->remove('oauth2state');
|
||||
throw new AuthorizationRequestException('Missing state or mismatch', 400, $request);
|
||||
}
|
||||
|
||||
$session->remove('oauth2state');
|
||||
|
||||
return $this->getProvider()->getAccessToken('authorization_code', [
|
||||
'code' => $code,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getProvider(): AbstractProvider
|
||||
{
|
||||
$redirectUrl = $this
|
||||
->urlGenerator
|
||||
->generate('app_myep_auth_check', [], UrlGeneratorInterface::ABSOLUTE_URL)
|
||||
;
|
||||
|
||||
return new GenericProvider([
|
||||
'clientId' => $this->config['myep_oauth2_client_id'],
|
||||
'clientSecret' => $this->config['myep_oauth2_client_secret'],
|
||||
'redirectUri' => $redirectUrl,
|
||||
'urlAuthorize' => $this->config['myep_oauth2_url_authorize'],
|
||||
'urlAccessToken' => $this->config['myep_oauth2_url_access_token'],
|
||||
'urlResourceOwnerDetails' => $this->config['myep_oauth2_url_resource_owner_details'],
|
||||
'scopes' => $this->config['myep_oauth2_scopes'],
|
||||
'scopeSeparator' => ' ',
|
||||
]);
|
||||
}
|
||||
|
||||
private function resolveConfig(array $options): array
|
||||
{
|
||||
$optionsResolver = new OptionsResolver();
|
||||
$optionsResolver->setRequired([
|
||||
'myep_oauth2_client_id',
|
||||
'myep_oauth2_client_secret',
|
||||
'myep_oauth2_url_authorize',
|
||||
'myep_oauth2_url_access_token',
|
||||
'myep_oauth2_url_resource_owner_details',
|
||||
'myep_oauth2_scopes',
|
||||
]);
|
||||
|
||||
return $optionsResolver->resolve($options);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user