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

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

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

Есть идеи?

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

config.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

security.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 }

routing.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
    }
}

2 ответа

Решение

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

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

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

Я думаю, что вы должны расширить FOS\UserBundle\Entity\User вместо FOS\UserBundle\Model\User.

Другие вопросы по тегам