简体   繁体   English

Facebook登录-HWIOauthBundle-如果找到用户,则更新FacebookID

[英]Facebook Login - HWIOauthBundle - Update FacebookID if user found

I had implemented HWIOauthBundle - Facebook Login into my symfony app. 我已经实现了HWIOauthBundle-Facebook登录到我的symfony应用中。

I have a problem if a user were already registered using FOSUserBundle, before Facebook Login. 如果在Facebook登录之前已经使用FOSUserBundle注册了用户,我会遇到问题。

If I have the user, and try to login with facebook, Facebook ID won't update in the database if the E-mail already exists. 如果我有该用户,并尝试使用Facebook登录,如果该电子邮件已经存在,则Facebook ID不会在数据库中更新。

Where should I put my code, that verifies if an E-mail exists, and if yes, to update the facebook_id column after the Facebook connection? 我应该在哪里放置我的代码,以验证是否存在电子邮件,如果存在,则在Facebook连接后更新facebook_id列?

You can extend the HWIOauthBundle's FOSUBUserProvider class and implement required logic. 您可以扩展HWIOauthBundle的FOSUBUserProvider类并实现所需的逻辑。 Example (relevant for HWIOauthBundle 0.4.x): 示例(与HWIOauthBundle 0.4.x相关):

src/AppBundle/Security/Core/User/FOSUBUserProvider.php SRC /的appbundle /安全/核心/用户/ FOSUBUserProvider.php

<?php

namespace AppBundle\Security\Core\User;

use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotLinkedException;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use AppBundle\Entity\User;
use Symfony\Component\Security\Core\User\UserInterface;
use AppBundle\Event\UserEvent;
use AppBundle\Doctrine\UserManager;

class FOSUBUserProvider extends BaseClass
{
    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $id = $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([$this->getProperty($response) => $id])) {
            $previousUser->$setterId(null);
            $previousUser->$setterToken(null);
            $this->userManager->updateUser($previousUser);
        }

        //connect current user
        $user->$setterId($id);
        $user->$setterToken($response->getAccessToken());

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

    /**
     * {@inheritdoc}
     */
    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        $id = $response->getUsername();
        $email = $response->getEmail();

        if (empty($email)) {
            throw new AccountNotLinkedException("Email is empty");
        }

        /** @var User $user */
        $user = $this->userManager->findUserBy([$this->getProperty($response) => $id]);
        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($id);
                $user->$setterToken($response->getAccessToken());

                $user->setUsername($id)
                    ->setFirstName($response->getFirstName())
                    ->setLastName($response->getLastName() ?: $response->getRealName())
                    ->setPassword('123456');

                $user->setEmail($email);
                $user->setEnabled(true);
                $this->userManager->updateUser($user);

                return $user;
            } else {
                $user->$setterId($id);
                $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;
    }
}

services.yml services.yml

services:
    app.my_user_provider:
        class: AppBundle\Security\Core\User\FOSUBUserProvider
        arguments: ['@fos_user.user_manager', { facebook: 'facebookId' }]

config.yml config.yml

hwi_oauth:
    connect:
        account_connector: app.my_user_provider

security.yml security.yml

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM