Я пытался весь день понять это. Так что здесь идет.
я использую 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", "[email protected]", "[email protected]", 1, "fgf90m9yxzc4ggkgwg8cgk0g4sk0ocg", "10155345628995713", null, 0, 0, null, null, null, "a:0:{}", 0, null, "10155387178995713", "CAALREhhNZBmEBANQjAMjlrAHZduiwOidsUyVwCI0hQkSj7W9imZC2xlL76jGH3MA10yUBkF2kSCpr9OdBbUSPoKkriZA2FdVlAhFsfXBNjBYiywzodiWYKGrcVMVsMVIVbk6XDUFVDtighTDYKuT9fZBm96VUSZBNSOE92RJMNwtAZCwBKrerAKGB11gNLNqDzNOfnBgih6TQDhacd9xSOC"]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_1483A5E9A0D96FBF'
Если я регистрируюсь с помощью обычной формы, а затем подписываю ее также с помощью обычной формы, я получаю ожидаемое «Электронная почта уже используется»
если я сначала зарегистрируюсь через 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/ но все равно не повезло.
Любая помощь могла бы быть полезна. Рад опубликовать информацию о конфигурации или код, если требуется.
Спасибо
решаемая
Я должен был перевесить 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;
}
В предыдущей версии Symfony 2.5 была ошибка проверки, вы можете попробовать использовать 2.4 для проверки в config.yml, если это решит проблему.
framework:
validation:
enabled: true
api: 2.4
enable_annotations: true # Provided already by when first installing Symfony
https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516