Для авторизации пользователя в 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!