我整天都试着想出这个。所以这里。
我正在使用Symfony version 2.6.4
我最初使用friendsofsymfony/user-bundle": "2.0.*@dev
我刚刚添加"hwi/oauth-bundle": "0.4.*@dev"
以允许facebook注册/登录。
问题是,如果我使用我的常规表单注册,然后尝试使用facebook登录,我会收到以下错误。 (我为显示目的更改了一些值):
An exception occurred while executing 'INSERT INTO users (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expired, expires_at, confirmation_token, password_requested_at, roles, credentials_expired, credentials_expire_at, facebook_id, facebook_access_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["10155387178995713", "10155387178995713", "someemail@hotmail.com", "someemail@hotmail.com", 1, "fgf90m9yxzc4ggkgwg8cgk0g4sk0ocg", "10155345628995713", null, 0, 0, null, null, null, "a:0:{}", 0, null, "10155387178995713", "CAALREhhNZBmEBANQjAMjlrAHZduiwOidsUyVwCI0hQkSj7W9imZC2xlL76jGH3MA10yUBkF2kSCpr9OdBbUSPoKkriZA2FdVlAhFsfXBNjBYiywzodiWYKGrcVMVsMVIVbk6XDUFVDtighTDYKuT9fZBm96VUSZBNSOE92RJMNwtAZCwBKrerAKGB11gNLNqDzNOfnBgih6TQDhacd9xSOC"]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'someemail@hotmail.com' for key 'UNIQ_1483A5E9A0D96FBF'
如果我使用常规表单进行注册,然后使用常规表单进行签名,我就会得到预期的#34;电子邮件已经在使用"
如果我首先使用Facebook注册然后使用Facebook登录,那么它可以正常运行。
使用标准登录表单时的用户名/ username_cononical设置与使用facebook注册时不同。目前,正常登录表单下的用户名生成一个随机字符串。
我不关心用户名。如果它更新到facebook给出的那个很棒。我只使用电子邮件登录,但将用户名条目保留在数据库中,因为它是FOSUserBundle的标准
我已按照此处的说明操作:https://gist.github.com/danvbe/4476697
我也读过这个:http://m2mdas.github.io/blog/2013/11/21/integrate-hwioauthbundle-with-fosuserbundle/但仍然没有运气。
任何帮助都会非常感激。很高兴在需要时发布配置信息或代码。
感谢
答案 0 :(得分:1)
<强>解决强>
我不得不覆盖HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider
如此处所述:https://gist.github.com/danvbe/4476697
但是我必须自定义loadUserByOAuthUserResponse
方法以满足我的需求。
父方法预计数据库中的任何现有用户之前也已使用OAuth响应中的相同信息添加
在我的特定情况下,我必须执行以下操作:
/**
* {@inheritdoc}
*/
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$username = $response->getUsername();
$email = $response->getEmail();
/** @var \AppBundle\Entity\User $user */
$user = $this->userManager->findUserByEmail($email);
$serviceName = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($serviceName);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
$getter = 'get'.$serviceName;
$getter_id = $getter.'Id';
$getter_token = $getter.'AccessToken';
//when the user is registering
if (null === $user) {
// create new user here
$user = $this->userManager->createUser();
$user->$setter_id($username);
$user->$setter_token($response->getAccessToken());
$user->setEmail($email);
$user->setPassword($this->generatePassword(12));
$user->setEnabled(true);
$this->userManager->updateUser($user);
return $user;
}
//if user exists
if($user->$getter_id() == ""){
$user->$setter_id($username);
}
//update access token
$user->$setter_token($response->getAccessToken());
return $user;
}
答案 1 :(得分:0)
在以前的symfony 2.5中有一个验证错误,你可能想尝试在config.yml中使用2.4进行验证,如果它解决了问题。
framework:
validation:
enabled: true
api: 2.4
enable_annotations: true # Provided already by when first installing Symfony
https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516
答案 2 :(得分:0)
对于5年后可能会遇到此问题的人, 您可能需要设置用户名:
$user->setUsername($email);
为我工作。