feat: oauth2 login via myep

This commit is contained in:
Björn Fromme committed 2026-08-12 08:14:13 +02:00
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;
}
}
+82
View File
@@ -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);
}
}