Ошибка "Имя пользователя не найдено" при использовании HWIOAuthBundle с FOSUserBundle


Здесь я зашел в тупик. Использование HWIOAuthBundle для разрешения входа в социальную сеть с помощью FOSUserBundle на Symfony3.

Вход с использованием имени пользователя и пароля работает нормально, но при аутентификации с помощью социальных логинов (в моем случае Facebook и LinkedIn) при перенаправлении на страницу входа возвращается ошибка "Имя пользователя не найдено".

Есть идеи?

Соответствующие части соответствующих файлы:

Конфигурация.yml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: AppBundle\Entity\User

hwi_oauth:
    firewall_names: [secured_area]
    connect:
        account_connector: hwi_oauth.user.provider.fosub_bridge
        confirmation: true
    resource_owners:
        facebook:
            type:                facebook
            client_id:           xxx
            client_secret:       xxx
        linkedin:
            type:                linkedin
            client_id:           xxx
            client_secret:       xxx
    fosub:
        username_iterations: 30
        properties:
            facebook: facebookId
            linkedin: linkedinId

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

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false

        secured_area:
            anonymous: ~
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager
            oauth:
                resource_owners:
                    facebook:   "/login/check-facebook"
                    linkedin:   "/login/check-linkedin"
                login_path:     /login
                use_forward:    false
                failure_path:   /login
                check_path:     /login
                oauth_user_provider:
                    service: hwi_oauth.user.provider.fosub_bridge

            logout:
                path: /logout


        main:
            pattern: ^/
            logout:       true
            anonymous:    true


    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/connect$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

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

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

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

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

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

facebook_login:
    path: /login/check-facebook

linkedin_login:
    path: /login/check-linkedin

User.php

<?php
// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=200, name="firstName", nullable=true)
     */
    protected $firstName;

    /**
     * @ORM\Column(type="string", length=200, name="lastName", nullable=true)
     */
    protected $lastName;

    /**
     * @ORM\Column(name="facebookId", type="string", length=255, nullable=true)
     */
    private $facebookId;

    /**
     * @ORM\Column(name="linkedinId", type="string", length=255, nullable=true)
     */
    private $linkedinId;

    private $facebookAccessToken;


    public function getFirstName() {
        return $this->firstName;
    }

    public function getLastName() {
        return $this->lastName;
    }

    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;
        return $this;
    }

    public function setLastName($setLastName)
    {
        $this->lastName = $setLastName;
        return $this;
    }

     /**
     * @param string $facebookId
     * @return User
     */
    public function setFacebookId($facebookId)
    {
        $this->facebookId = $facebookId;

        return $this;
    }

    /**
     * @param string $linkedinId
     * @return User
     */
    public function setLinkedinId($linkedinId)
    {
        $this->linkedinId = $linkedinId;

        return $this;
    }


    /**
     * @return string
     */
    public function getFacebookId()
    {
        return $this->facebookId;
    }

    /**
     * @return string
     */
    public function getLinkedinId()
    {
        return $this->linkedinId;
    }

    /**
     * @param string $facebookAccessToken
     * @return User
     */
    public function setFacebookAccessToken($facebookAccessToken)
    {
        $this->facebookAccessToken = $facebookAccessToken;

        return $this;
    }

    /**
     * @return string
     */
    public function getFacebookAccessToken()
    {
        return $this->facebookAccessToken;
    }

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}
Author: Jacob Manser, 2016-07-28

2 answers

У меня была аналогичная проблема, но в итоге возникла проблема с функцией getUser в моем пользовательском классе guard, которая не возвращала действительного пользователя.

Поэтому для всех, кто найдет этот вопрос, убедитесь, что ваш getUser возвращает действительный объект пользователя, который наследуется от соответствующего класса пользователя безопасности Symfony или реализует соответствующий интерфейс пользователя.

Например. Symfony\Component\Security\Core\User\UserInterface

 1
Author: Jayd, 2017-04-26 09:56:05

Я думаю, что вам нужно расширить FOS\UserBundle\Сущность\Пользователь вместо FOS\UserBundle\Модель\Пользователь.

 0
Author: Grzegorz Krauze, 2016-11-27 17:44:31