2017-05-31 9 views
0

私はHWIOauthBundleを実装しました - Facebookログインを私のsymfonyアプリケーションに実装しました。Facebookログイン - HWIOauthBundle - ユーザが見つかった場合はFacebookIDを更新します

Facebookのログインの前に、FOSUserBundleを使用してユーザーが既に登録されていると問題があります。

ユーザーがいてfacebookでログインしようとすると、電子メールが既に存在する場合、Facebook IDはデータベースで更新されません。

電子メールが存在するかどうかを確認するコードはどこに入れてください。はいの場合は、Facebook接続後にfacebook_id列を更新しますか?

答えて

0

HWIOauthBundleのFOSUBUserProviderクラスを拡張し、必要なロジックを実装できます。 (HWIOauthBundleの0.4.xに関連する)例:

の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: 
    app.my_user_provider: 
     class: AppBundle\Security\Core\User\FOSUBUserProvider 
     arguments: ['@fos_user.user_manager', { facebook: 'facebookId' }] 

config.yml

hwi_oauth: 
    connect: 
     account_connector: app.my_user_provider 

security.yml

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

[Symfony \ Component \ DependencyInjection \ Exception \ ParameterNotFoundException] サービス "app.my_user_provider"は、存在しないパラメータ "facebook_id"に依存しています。 – Kiddo

+0

facebook_idは、facebookトークンフィールド名のパラメータです。サンプルコードを使用する場合は、parametersセクションのparameters.ymlまたはconfig.ymlにサンプルコードを定義してください。例えば。 facebook_id: 'サービスを:: app.my_user_provider: クラス:HWI \バンドル\ OAuthBundle \セキュリティ\コア\ユーザー\ FOSUBUserProvider 引数:私は私のコードを変更し、追加した –

+0

をfacebookId [ '@user_manager' を、{Facebookの ' %facebook_id% '}] ' – Kiddo

関連する問題