Пользовательский FOSUBUserProvider не работает должным образом

Я следовал инструкции здесь: https://gist.github.com/danvbe/4476697 Прочитал всю ветку несколько раз, но решения своей проблемы так и не нашел. Я хочу использовать пакет oauth только для привязки учетной записи, сохраняя пользовательские данные от провайдера oauth. Мои пользователи не будут аутентифицироваться с помощью oauth. Тем не менее, я реализовал все это, чтобы увидеть, работает ли он с github в качестве провайдера, но ничего. Я могу перейти на страницу авторизации, но когда я нажимаю «Разрешить доступ», меня неизбежно перенаправляет на страницу входа с этой ошибкой No oauth code in the request. Если прекратить использование пользовательского FOSUBUserProvider и перейти на HWI по умолчанию, я зарегистрирую приложение в Github, но не смогу сохранить данные.

Важно: я попытался точно воспроизвести FOSUBUserProvider из HWI, и та же проблема осталась, поэтому, вероятно, это связано не с реализацией, а, возможно, с определением службы или конфигурацией. Любая помощь приветствуется.

Это соответствующие файлы:

FOSUBUserProvider.php

class FOSUBUserProvider extends BaseClass
{
    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $property = $this->getProperty($response);
        $username = $response->getUsername();

        //on connect - get the access token and the user ID
        $service = $response->getResourceOwner()->getName();

        $setter = 'set'.ucfirst($service);
        $setter_id = $setter.'Id';
        $setter_token = $setter.'AccessToken';

        //we "disconnect" previously connected users
        if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
            $previousUser->$setter_id(null);
            $previousUser->$setter_token(null);
            $this->userManager->updateUser($previousUser);
        }

        //we connect current user
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());

        $this->userManager->updateUser($user);
    }

    /**
     * {@inheritdoc}
     */
    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        $username = $response->getUsername();
        $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
        //when the user is registrating
        if (null === $user) {
            $service = $response->getResourceOwner()->getName();
            $setter = 'set'.ucfirst($service);
            $setter_id = $setter.'Id';
            $setter_token = $setter.'AccessToken';
            // create new user here
            $user = $this->userManager->createUser();
            $user->$setter_id($username);
            $user->$setter_token($response->getAccessToken());
            //I have set all requested data with the user's username
            //modify here with relevant data
            $user->setUsername($username);
            $user->setEmail($username);
            $user->setPassword($username);
            $user->setEnabled(true);
            $this->userManager->updateUser($user);
            return $user;
        }

        //if user exists - go with the HWIOAuth way
        $user = parent::loadUserByOAuthUserResponse($response);

        $serviceName = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

        //update access token
        $user->$setter($response->getAccessToken());

        return $user;
    }

}

config.yml

hwi_oauth:
    #this is my custom user provider, created from FOSUBUserProvider - will manage the
    #automatic user registration on your site, with data from the provider (facebook. google, etc.)
    #and also, the connecting part (get the token and the user_id)
    connect:
        account_connector: custom.user.provider
    # name of the firewall in which this bundle is active, this setting MUST be set
    firewall_name: main

    # optional FOSUserBundle integration
    fosub:
        # try 30 times to check if a username is available (foo, foo1, foo2 etc)
        username_iterations: 30

        # mapping between resource owners (see below) and properties
        properties:
            github: githubId

    # optional HTTP Client configuration
    http_client:
        verify_peer:   false

    resource_owners:
        github:
            type:                 github
            client_id:            xxxxxxxxxxxxxxxxxxxxxx
            client_secret:        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            scope:                "repo, delete_repo, notifications, gist"
            options:
                csrf:             true

безопасность.yml

providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls: #CAUTION! The order of the firewalls IS ON PURPOSE! DON'T CHANGE!
        # Disabling the security for the web debug toolbar, the profiler and Assetic.
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        # -> custom firewall for the admin area of the URL
        admin:
            pattern:            /admin(.*)
            context:            user
            form_login:
                provider:       fos_userbundle
                login_path:     /admin/login
                use_forward:    false
                check_path:     /admin/login_check
                failure_path:   null
            logout:
                path:           /admin/logout
            anonymous:          true

        # -> end custom configuration

        # defaut login area for standard users

        # This firewall is used to handle the public login area
        # This part is handled by the FOS User Bundle
        main:
            pattern:             .*
            context:             user
            form_login:
                provider:       fos_userbundle
                login_path:     /login
                use_forward:    false
                check_path:     /login_check
                failure_path:   null
            logout:             true
            anonymous:          true

            # Login path for OAuth providers
            oauth:
                resource_owners:
                    github:             "/login/check-github"
                    trello:             "/login/check-trello"
                login_path:        /login
                failure_path:      /login

                # FOSUB integration
#                oauth_user_provider:
#                    service: hwi_oauth.user.provider.fosub_bridge
                oauth_user_provider:
                    #this is my custom user provider, created from FOSUBUserProvider - will manage the
                    #automatic user registration on website, with data from the provider (github. trello, etc.)
                    service: custom.user.provider

    access_control:
        # URL of FOSUserBundle which need to be available to anonymous users
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # Admin login page needs to be access without credential
        - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # Secured part of the site
        # This config requires being logged for the whole site and having the admin role for the admin part.
        # Change these rules to adapt them to your needs
        - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
        - { path: ^/.*, role: ROLE_USER } #This is on purpose.

маршрутизация.yml

hwi_oauth_security:
    resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
    prefix: /connect

hwi_oauth_connect:
    resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml"
    prefix: /connect

hwi_oauth_redirect:
    resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
    prefix:   /connect

services.yml

parameters:
    custom.user.provider.class: My\Bundle\Path\Security\Core\User\FOSUBUserProvider

services:
    sonata.admin.user:
        class: My\Bundle\Path\Admin\Model\UserAdmin
        tags:
#            - { name: sonata.admin, manager_type: orm, group: users, label: users, label_translator_strategy: sonata.admin.label.strategy.underscore }
        arguments:
            - ~
            - My\Bundle\Path\Entity\User
            - SonataAdminBundle:CRUD
        calls:
            - [setTranslationDomain, [SonataUserBundle]]
            - [setUserManager, [@fos_user.user_manager]]
            - [setSecurityContext, [@security.context]]

    custom.user.provider:
        class: "%custom.user.provider.class%"
        #this is the place where the properties are passed to the UserProvider - see config.yml
        arguments: [@fos_user.user_manager,{github: github_id, trello: trello_id}]

person Reydel Leon    schedule 12.11.2013    source источник


Ответы (1)


Что ж, после долгих проб и ошибок я нашел проблему:

URL-адрес обратного вызова в Github был: http://mywebsite/login/check-github, но это было неправильно. Правда в том, что я так и не нашел, на что должно быть установлено это значение, поэтому я предположил. Случайно я обнаружил правильный URL: http://mywebsite/connect/service/github применимый в моем случае, с моей конфигурацией.

Я нашел его в одном из случаев, когда пробовал использовать HWI-провайдера по умолчанию, проверяя перенаправления с помощью консоли браузера.

person Reydel Leon    schedule 14.11.2013