Как авторизовать пользователя в Symfony в случае OAuth?

Для авторизации пользователя в Symfony с использованием OAuth, вам потребуется использовать пакет "league/oauth2-client". Вот подробный шаг за шагом процесс авторизации пользователя с помощью OAuth в Symfony:

Шаг 1: Установка зависимостей
Первым шагом является установка пакета "league/oauth2-client" с помощью команды composer:

composer require league/oauth2-client

Шаг 2: Создание сервиса для OAuth-авторизации
Следующим шагом является создание сервиса, который будет обрабатывать авторизацию OAuth. Создайте файл "OAuthService.php" в вашем Symfony проекте.

<?php

use LeagueOAuth2ClientProviderAbstractProvider;
use LeagueOAuth2ClientProviderExceptionIdentityProviderException;
use LeagueOAuth2ClientProviderGenericProvider;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationSessionSessionInterface;

class OAuthService
{
    private $provider;
    private $session;

    public function __construct(SessionInterface $session)
    {
        $this->provider = new GenericProvider([
                'clientId' => 'your_client_id',
                'clientSecret' => 'your_client_secret',
                'redirectUri' => 'your_redirect_uri',
                'urlAuthorize' => 'authorization_url',
                'urlAccessToken' => 'access_token_url',
                'urlResourceOwnerDetails' => 'resource_owner_details_url',
        ]);

        $this->session = $session;
    }

    public function getAuthorizationUrl(): string
    {
        $options = [
            'scope' => ['scope1', 'scope2'],
        ];

        return $this->provider->getAuthorizationUrl($options);
    }

    public function handleCallback(Request $request): ?RedirectResponse
    {
        $code = $request->get('code');

        if (!$code) {
            // Ошибка авторизации, перенаправляем пользователя на страницу ошибки
            return new RedirectResponse('/error');
        }

        try {
            $accessToken = $this->provider->getAccessToken('authorization_code', [
                'code' => $code,
            ]);

            // Получаем доступ к данным пользователя
            $resourceOwner = $this->provider->getResourceOwner($accessToken);

            // Сохраняем данные пользователя в сессии или базе данных
            $this->session->set('user', $resourceOwner->toArray());

            // Перенаправляем пользователя на обычную страницу
            return new RedirectResponse('/user');
        } catch (IdentityProviderException $e) {
            // Ошибка авторизации, перенаправляем пользователя на страницу ошибки
            return new RedirectResponse('/error');
        }
    }

    public function getUserData(): ?array
    {
        return $this->session->get('user');
    }
}

Вы должны настроить значения в конструкторе сервиса "clientId", "clientSecret", "redirectUri" и другие URL-ы - в соответствии с вашими настройками OAuth провайдера.

Шаг 3: Настройка маршрута и контроллера
Откройте "config/routes.yaml" файл и добавьте следующие маршруты:

oauth_authorize:
    path: /oauth/authorize
    controller: AppControllerOAuthController::authorize

oauth_callback:
    path: /oauth/callback
    controller: AppControllerOAuthController::callback

user:
    path: /user
    controller: AppControllerUserController::index

Затем создайте контроллер "OAuthController.php" с методами "authorize" и "callback":

<?php

namespace AppController;

use AppServiceOAuthService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpFoundationRequest;

class OAuthController extends AbstractController
{
    private $oauthService;

    public function __construct(OAuthService $oauthService)
    {
        $this->oauthService = $oauthService;
    }

    public function authorize(): RedirectResponse
    {
        $authorizationUrl = $this->oauthService->getAuthorizationUrl();

        return $this->redirect($authorizationUrl);
    }

    public function callback(Request $request): RedirectResponse
    {
        return $this->oauthService->handleCallback($request);
    }
}

Затем создайте контроллер "UserController.php" для обычной страницы пользователя:

<?php

namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;

class UserController extends AbstractController
{
    public function index()
    {
        $userData = $this->getUserData();

        // Отобразить данные пользователя на странице

        return $this->render('user/index.html.twig');
    }
}

Шаг 4: Создание шаблонов
Наконец, создайте шаблон страницы пользователя в "templates/user/index.html.twig":

<!DOCTYPE html>
<html>
    <head>
        <title>User Page</title>
    </head>
    <body>
        <h1>Welcome, {{ userData.name }}!</h1>
    </body>
</html>

Шаг 5: Использование OAuthService
Теперь вы можете использовать сервис "OAuthService" в любом месте вашего приложения, чтобы получить данные пользователя:

<?php

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationSessionSessionInterface;

class AnyController
{
    private $oauthService;

    public function __construct(SessionInterface $session)
    {
        $this->oauthService = new OAuthService($session);
    }

    public function anyAction()
    {
        // Получить URL авторизации
        $authorizationUrl = $this->oauthService->getAuthorizationUrl();

        // Перенаправить пользователя на страницу авторизации OAuth
        return new RedirectResponse($authorizationUrl);
    }

    public function callbackAction(Request $request)
    {
        // Обработать OAuth callback и авторизовать пользователя
        return $this->oauthService->handleCallback($request);
    }
}

В итоге, когда пользователь перейдет на страницу, где будет использоваться anyAction(), он будет перенаправлен на страницу авторизации OAuth провайдера. После успешной авторизации и прохождения callback-а, пользователь будет перенаправлен на страницу пользователя (user/index.html.twig), где его данные будут отображаться.

Надеюсь, эта подробная инструкция поможет вам авторизовать пользователя с использованием OAuth в Symfony!