facebooksymfonyfosuserbundlehwioauthbundle

Unrecognized field: facebookId


I try to connect symfony 3 with HWIOAUTH Bundle and follow the tutorial https://gist.github.com/danvbe/4476697.

file config.yml

hwi_oauth:
connect:
    account_connector: my_user_provider
firewall_names: [main]
fosub:

    username_iterations: 30


    properties:
        google: googleId
        facebook: facebookId
resource_owners:
    facebook:
        type:                facebook
        client_id:           ***************
        client_secret:       ***************
        scope:               ""
    google:
        type:                google
        client_id:           ***************
        client_secret:      ***************
        scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

security.yml

main:
        pattern:             .*
        context:             user
        form_login:
            provider:       fos_userbundle
            login_path:     /login
            use_forward:    false
            check_path:     /login_check
            failure_path:   null
            default_target_path: list_items
            always_use_default_target_path: true
        oauth:
            resource_owners:
                facebook:           "/connect/check-facebook"
                google:             "/connect/check-google"
            login_path:        /connect
            failure_path:      /connect

            oauth_user_provider:
                #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.)
                service: my_user_provider
        logout:             true
        anonymous:          true

service.yml

my_user_provider:
    class: AppBundle\Entity\FOSUBUserProvider
    arguments: ['@fos_user.user_manager',{facebook: facebookId, google: googleId}]

Please help me fix this bug. I spent many times but can't fix it.

Update: Entity User

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

Solution

  • I use symfony 3.3.15 , this is correct configuration:

    //User.php
    <?php
    
    namespace BackendBundle\Entity;
    
    use FOS\UserBundle\Model\User as BaseUser;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * User
     *
     * @ORM\Table(name="fos_user")
     * @ORM\Entity
     */
    class User extends BaseUser
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        protected $id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="facebook_id", type="string", length=255, nullable=true)
         */
        private $facebook_id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="facebook_access_token", type="string", length=255, nullable=true)
         */
        private $facebook_access_token;
    
        /**
         * @var string
         *
         * @ORM\Column(name="google_id", type="string", length=255, nullable=true)
         */
        private $google_id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="google_access_token", type="string", length=255, nullable=true)
         */
        private $google_access_token;
    
    
        /**
         * Set facebook_id
         *
         * @param string $facebook_id
         *
         * @return User
         */
        public function setFacebookId($facebook_id)
        {
            $this->facebook_id = $facebook_id;
    
            return $this;
        }
    
        /**
         * Get facebook_id
         *
         * @return string
         */
        public function getFacebookId()
        {
            return $this->facebook_id;
        }
    
        /**
         * Set facebook_access_token
         *
         * @param string $facebook_access_token
         *
         * @return User
         */
        public function setFacebookAccessToken($facebook_access_token)
        {
            $this->facebook_access_token = $facebook_access_token;
    
            return $this;
        }
    
        /**
         * Get facebook_access_token
         *
         * @return string
         */
        public function getFacebookAccessToken()
        {
            return $this->facebook_access_token;
        }
    
        /**
         * Set google_id
         *
         * @param string $google_id
         *
         * @return User
         */
        public function setGoogleId($google_id)
        {
            $this->google_id = $google_id;
    
            return $this;
        }
    
        /**
         * Get google_id
         *
         * @return string
         */
        public function getGoogleId()
        {
            return $this->google_id;
        }
    
        /**
         * Set google_access_token
         *
         * @param string $google_access_token
         *
         * @return User
         */
        public function setGoogleAccessToken($google_access_token)
        {
            $this->google_access_token = $google_access_token;
    
            return $this;
        }
    
        /**
         * Get google_access_token
         *
         * @return string
         */
        public function getGoogleAccessToken()
        {
            return $this->google_access_token;
        }
    
    }
    

    Other file services.yml:

    //services.yml
    services:
        my_user_provider:
            class: AppBundle\Security\Core\User\FOSUBUserProvider
            arguments: ['@fos_user.user_manager',{facebook: facebook_id,google: google_id}]
    

    Next file FOSUBUserProvider:

    //Security/Core/User
    <?php
    namespace AppBundle\Security\Core\User;
    
    use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
    use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
    use Symfony\Component\Security\Core\User\UserInterface;
    
    class FOSUBUserProvider extends BaseClass
    {
        /**
         * {@inheritDoc}
         */
        public function connect(UserInterface $user, UserResponseInterface $response)
        {
            $username = $response->getUsername();
    
            $service = $response->getResourceOwner()->getName();
            $setter = 'set' . ucfirst($service);
            $setterId = $setter . 'Id';
            $setterToken = $setter . 'AccessToken';
    
            //disconnect previously connected user
            if (null !== $previousUser = $this->userManager->findUserBy(array($this->getProperty($response) => $username))) {
                $previousUser->$setterId(null);
                $previousUser->$setterToken(null);
                $this->userManager->updateUser($previousUser);
            }
    
            //connect current user
            $user->$setterId($username);
            $user->$setterToken($response->getAccessToken());
    
            $this->userManager->updateUser($user);
        }
    
        /**
         * {@inheritdoc}
         */
        public function loadUserByOAuthUserResponse(UserResponseInterface $response)
        {
            $username = $response->getUsername();
            $email = $response->getEmail();
    
            $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
            if (null === $user) {
                $user = $this->userManager->findUserByEmail($email);
    
                $service = $response->getResourceOwner()->getName();
                $setter = 'set' . ucfirst($service);
                $setterId = $setter . 'Id';
                $setterToken = $setter . 'AccessToken';
    
                if (null === $user) {
                    $user = $this->userManager->createUser();
                    $user->$setterId($username);
                    $user->$setterToken($response->getAccessToken());
    
                    $user->setUsername($username);
                    $user->setEmail($email);
                    $user->setPassword($username);
                    $user->setEnabled(true);
                    $this->userManager->updateUser($user);
    
                    return $user;
                } else {
                    $user->$setterId($username);
                    $user->$setterToken($response->getAccessToken());
    
                    $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;
        }
    }
    

    The file config.yml

    fosub:
            username_iterations: 30
            properties:
                facebook:    facebook_id
                google:      google_id
        resource_owners:
            facebook:
                type:                facebook
                client_id:           gkhgkjgkjgkjgkj
                client_secret:       kjhkjkjhkjhlkjhlkjh
                #scope:               "email"
                #scope:               ""
                scope:               "email,public_profile,user_friends,user_birthday,user_location"
    
            google:
                type:                google
                client_id:           kjhlkjhlkjhljhlkjhlk-gkhjgkjhgkjhgkgjhkjhgkjgkjgkjh.apps.googleusercontent.com
                client_secret:       gjgjgj-hkjhgkhgkjh
                #scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
                scope:               "email profile"
    

    Next file: security.yml

    oauth:
                    resource_owners:
                        facebook:           "/login/check-facebook"
                        google:             "/login/check-google"
                    login_path:        /login
                    failure_path: /login
                    oauth_user_provider:
                        service: my_user_provider
    

    Regards