【问题标题】:Symfony HWIOauthBundle, FOSUserBundle. Integrity constraint violation: 1062 Duplicate entrySymfony HWIOauthBundle,FOSUserBundle。完整性约束违规:1062 重复条目
【发布时间】:2015-05-18 02:24:09
【问题描述】:

我已经尝试了一整天来解决这个问题。就这样吧。

我正在使用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 登录,它就可以正常工作。

使用标准登录表单时的用户名/用户名_cononical 设置与使用 facebook 注册时不同。目前普通登录表单下的用户名生成随机字符串。

无论哪种方式,我都不关心用户名。如果它更新到 facebook 给出的那将是很棒的。我只使用电子邮件登录,但将用户名条目保留在数据库中,因为它是 FOSUserBundle 的标准

我已按照此处的说明进行操作:https://gist.github.com/danvbe/4476697

我也读过这个:http://m2mdas.github.io/blog/2013/11/21/integrate-hwioauthbundle-with-fosuserbundle/,但还是没有运气。

任何帮助将不胜感激。如果需要,很高兴发布配置信息或代码。

谢谢

【问题讨论】:

    标签: php symfony doctrine fosuserbundle hwioauthbundle


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      在之前的 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 Symfony
      

      https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516

      【讨论】:

      • 感谢@Nawfal Serrar 的输入,但我已经更改了这些设置,并且如果用户使用我的常规登录表单注册然后尝试登录 Facebook,则验证工作正常。我的问题是当用户第一次使用我的网络应用程序的登录表单注册,然后尝试使用 facebook 登录时。我已经解决了我的问题。谢谢
      【解决方案3】:

      对于那些可能在 5 年后面临这个问题的人, 您可能需要设置用户名:

      $user->setUsername($email);
      

      为我工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2019-09-12
        • 2016-05-23
        • 2013-10-21
        • 2021-07-07
        相关资源
        最近更新 更多