我已经试了一整天想弄清楚这件事。这样就可以了。
我正在使用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'如果我使用常规表单注册,然后也使用常规表单签名,我会得到预期的“电子邮件已在使用”
如果我先注册facebook,然后登录facebook,它的工作没有问题。
使用标准登录表单时的username/username_cononical设置与使用facebook注册时的设置不同。目前,普通登录表单下的用户名会生成一个随机字符串。
无论哪种方式,我都不关心用户名。如果它更新到facebook提供的版本,那就太好了。我只使用电子邮件登录,但将用户名条目保留在数据库中,因为这是FOSUserBundle的标准设置
我已经遵循了这里的说明:https://gist.github.com/danvbe/4476697
我还读到了这个:http://m2mdas.github.io/blog/2013/11/21/integrate-hwioauthbundle-with-fosuserbundle/,但仍然没有运气。
任何帮助都将不胜感激。乐于发布配置信息或代码,如果要求。
谢谢
发布于 2015-03-18 06:02:05
已解决的
我不得不重写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;
}发布于 2015-03-16 17:03:12
在之前的symfony 2.5中有一个验证错误,如果它修复了这个问题,你可能想尝试在config.yml中使用2.4进行验证。
app/config/config.yml
framework:
validation:
enabled: true
api: 2.4
enable_annotations: true # Provided already by when first installing Symfonyhttps://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516
发布于 2020-10-19 22:57:51
对于5年后可能会遇到此问题的用户,您可能需要设置用户名:
$user->setUsername($email);对我很管用。
https://stackoverflow.com/questions/29068910
复制相似问题