我已经使用这个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;
}
}
,我已经得到的问题如下:
- 如果我用Facebook登录,并我已经有一个帐户注册了同一个电子邮件,我想从facebook接收电子邮件,并更新facebook_id列。
- 如果存在具有相同电子邮件的帐户,我不想插入另一行。
有人知道我应该更新我的代码吗? 谢谢。
要权威性您将需要得到来自响应对象的电子邮件,然后通过电子邮件获取用户。 – Sean
值得注意的是,这是非常不安全的。你最好的选择是返回一个错误,让用户知道他们已经注册了一个帐户,并给他们在你的应用程序防火墙内连接一个Facebook帐户的能力。 例如。我注册了一个电子邮件和密码。后来我登录并决定我想用我的Facebook帐户来验证,所以我登录后连接我的Facebook帐户。然后,您只需存储身份验证令牌,将用户名设置为Facebook为用户名返回的所有内容,然后您就全部设置好了。 – Sean
@Sean这就是我真正想做的,但我不知道如何。 – Kiddo