Проблема с OAuth Facebook Authenticator на Symfony 4.3

Тема в разделе "PHP Pro", создана пользователем verfaa, 26 ноя 2019.

XEvil 4.0 Релиз Состоялся!
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    407
    Симпатии:
    47
    Пытаюсь подключить аутентификацию через facebook на тестовом сайте на Symfony 4.3
    После клика на кнопку войти через facebook меня просто кидает обратно на страницу логина безо всяких ошибок и предупреждений. Полазив по отдадчику обнаружил такую интересную вещь: запрос даже не доходит до FacebookAuthenticator!!

    [​IMG]

    Как видите, он проверяет App\Security\LoginFormAuthenticator - не подходит, затем проверяет App\Security\OAuth\FacebookAuthenticator - тоже не подходит, хотя должен подходить!

    Вот фрагмент security.yaml

    Код:
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
                    - App\Security\OAuth\FacebookAuthenticator
                entry_point: App\Security\LoginFormAuthenticator


    Вот метод supports класса App\Security\OAuth\FacebookAuthenticator
    Код:
        public function supports(Request $request): bool
        {
            $this->logger->info("Check this 1986: ".$request->attributes->get('_route'));
            return $request->attributes->get('_route') === 'oauth.facebook_check';
        }
    
    Кстати в логгер мне пишет это:
    Код:
        [2019-11-26 13:05:18] app.INFO: Check this 1986: app_login [] []
    
    При попытке подменить роут oauth.facebook_check на app_login symfony пишет мне ошибку "Invalid state parameter passed in callback URL."

    Вот часть из моего шаблона:
    Код:
                            <div class="row">
                                <div class="col-12">
                                    <a class="btn btn-block btn-facebook" href="{{ path('oauth.facebook') }}">
                                        <span>Log in by facebook</span>
                                    </a>
                                </div>
                            </div>
    
    Вот контроллер:
    Код:
        <?php
        declare(strict_types=1);
       
        namespace App\Controller\Auth\OAuth;
       
        use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
        use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
        use Symfony\Component\HttpFoundation\Response;
        use Symfony\Component\Routing\Annotation\Route;
       
        class FacebookController extends AbstractController
        {
       
            /**
             * @Route(path="/oauth/facebook", name="oauth.facebook")
             * @param ClientRegistry $clientRegistry
             * @return Response
             */
            public function connect(ClientRegistry $clientRegistry): Response
            {
                return $clientRegistry
                    ->getClient('facebook_main')
                    ->redirect(['public_profile']);
            }
       
            /**
             * @Route(path="oauth/facebook/check", name="oauth.facebook_check")
             * @return Response
             */
            public function check(): Response
            {
                return $this->redirectToRoute("home");
            }
        }
    
    Почему метод supports класса App\Security\OAuth\FacebookAuthenticator не срабатывает??? Ведь текущий роут должен совпадать с роутом, когда я кликаю по кнопке "Log in by facebook".
     
  2. JetSuit

    JetSuit Создатель Нарушитель

    Регистр.:
    18 июл 2011
    Сообщения:
    10
    Симпатии:
    30
    Такое лучше дебажить через xdebug. Поиграйся в коде метода supports сделай так что бы он возвращл true. Не доходит, так как этот метод не возвращает true.