2017-05-26 65 views
0

我已经使用这个CONFIGS为FOSUBUserProvider.php:的Facebook登录 - HWIOAuthBundle - Symfony3

namespace myapp\UserBundle\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) 
    { 
     $property = $this->getProperty($response); 
     $username = $response->getUsername(); 
     //on connect - get the access token and the user ID 
     $service = $response->getResourceOwner()->getName(); 
     $setter = 'set'.ucfirst($service); 
     $setter_id = $setter.'Id'; 
     $setter_token = $setter.'AccessToken'; 
     //we "disconnect" previously connected users 
     if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) { 
      $previousUser->$setter_id(null); 
      $previousUser->$setter_token(null); 
      $this->userManager->updateUser($previousUser); 
     } 
     //we connect current user 
     $user->$setter_id($username); 
     $user->$setter_token($response->getAccessToken()); 
     $this->userManager->updateUser($user); 
    } 
    /** 
    * {@inheritdoc} 
    */ 
    public function loadUserByOAuthUserResponse(UserResponseInterface $response) 
    { 
     $username = $response->getUsername(); 
     $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username)); 
     //when the user is registrating 
     if (null === $user) { 
      $service = $response->getResourceOwner()->getName(); 
      $setter = 'set'.ucfirst($service); 
      $setter_id = $setter.'Id'; 
      $setter_token = $setter.'AccessToken'; 
      // create new user here 
      $user = $this->userManager->createUser(); 
      $user->$setter_id($username); 
      $user->$setter_token($response->getAccessToken()); 
      //I have set all requested data with the user's username 
      //modify here with relevant data 
      $user->setUsername($username); 
      $user->setEmail($username); 
      $user->setPassword($username); 
      $user->setEnabled(true); 
      $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; 
    } 
} 

,我已经得到的问题如下:

  1. 如果我用Facebook登录,并我已经有一个帐户注册了同一个电子邮件,我想从facebook接收电子邮件,并更新facebook_id列。
  2. 如果存在具有相同电子邮件的帐户,我不想插入另一行。

有人知道我应该更新我的代码吗? 谢谢。

+0

要权威性您将需要得到来自响应对象的电子邮件,然后通过电子邮件获取用户。 – Sean

+0

值得注意的是,这是非常不安全的。你最好的选择是返回一个错误,让用户知道他们已经注册了一个帐户,并给他们在你的应用程序防火墙内连接一个Facebook帐户的能力。 例如。我注册了一个电子邮件和密码。后来我登录并决定我想用我的Facebook帐户来验证,所以我登录后连接我的Facebook帐户。然后,您只需存储身份验证令牌,将用户名设置为Facebook为用户名返回的所有内容,然后您就全部设置好了。 – Sean

+0

@Sean这就是我真正想做的,但我不知道如何。 – Kiddo

回答

0
  1. 让您的验证码保持原样,无需真正改变任何内容。

  2. 我假设你已经具备某种能够让用户“管理”他们的个人资料,所以只需简单地添加一个按钮,我们会将它标记为'connect facebook'以便参数。

  3. 确保您已经获得了您的Facebook授权代码设置并通过回复处理退货;

$(document).ready(function() { 
 
    $('#facebook-button').click(function() { 
 
     FB.login(function(response) { 
 
      if (response.authResponse) { 
 
       // Your auth response frmo faceook will contain an email, username, profile photo, etc 
 
       // console.log(response) to see exactly what's being returned 
 
       
 
       $.ajax({ 
 
        type: "POST", 
 
        url: {{ path('user_profile_update_post_path') }}, 
 
        data: [username: response.username, facebookId: response.facebookToken, /* etc */], 
 
        success: successCallback, 
 
        dataType: 'json' 
 
       }); 
 
      } 
 
     }, {scope: 'email'}); 
 
    }); 
 
});

通过存储的Facebook用户名和令牌等,用户应该然后能够与两个电子邮件/密码和/或Facebook

+0

你没有得到它:(我的Facebook登录工作。如果我没有任何帐户在我的数据库中,它会发送我注册,并且一切都会正常工作:正常登录+ Facebook登录。但是,如果我注册正常(没有Facebook),我尝试通过Facebook登录后,它不会工作,因为我没有存储facebook_id在我的数据库 – Kiddo

+0

我明白了,我不认为你理解我的解决方案上面 – Sean

+0

看看代码,这是一个用户谁是ALREADY登录与正常登录。 '使用该代码与Facebook进行身份验证',然后Facebook发送一个响应对象给您,然后您接收该响应对象,并使用facebook_id等更新您的用户帐户。 – Sean