Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Username could not be found" error when using HWIOAuthBundle with FOSUserBundle

Stumped here. Using HWIOAuthBundle to allow social login with FOSUserBundle on Symfony3.

Log in with username and password functions fine, but when authenticating with social logins (in my case, Facebook and LinkedIn), error "Username could not be found" is returned on a redirect to the login page.

Any ideas?

Relevant portions of relevant files:

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
    }
}
like image 507
Jacob Manser Avatar asked Nov 09 '22 11:11

Jacob Manser


1 Answers

I had a similar issue, but it ended up being an issue with the getUser function in my custom guard class not returning a valid user.

So for anyone finding this question, check that your getUser is returning a valid user object, which inherits from the relevant Symfony security user class or implements the relevant UserInterface.

Eg. Symfony\Component\Security\Core\User\UserInterface

like image 195
Jayd Avatar answered Nov 14 '22 21:11

Jayd