【问题标题】:Laravel Socialite Facebook images are incorrectLaravel Socialite Facebook 图片不正确
【发布时间】:2020-05-02 16:36:03
【问题描述】:

我有一个奇怪的问题,我无法弄清楚。我正在使用 Laravel Socialite 允许使用 Facebook 帐户登录,有很多用户抱怨他们帐户上显示的个人资料图片不正确,但是名称等都很好。

这对我来说毫无意义,因为名称和个人资料图片是同时直接从 FB 中提取的。

        public function socialUser(ProviderUser $providerUser)
        {
            $account = SocialFacebookAccount::whereProvider('facebook')->whereProviderUserId($providerUser->getId())->first();

            if ($account) {
                return $account->user;
            } else {

                $account = new SocialFacebookAccount([
                    'provider_user_id' => $providerUser->getId(),
                    'provider' => 'facebook'
                ]);

                $user = User::whereEmail( $providerUser->getId() )->first(); // changed from getEmail to getId as FB doesnt always give an email

                if (!$user) {

                    $profilePicName = md5(rand(1,10000)) . ".jpg";
                    $contents = file_get_contents( $providerUser->avatar_original );

                    Storage::disk('local')->put( 'profiles/' . $profilePicName, $contents );

                    $user = User::create([
                        'email' => $providerUser->getEmail(),
                        'name' => $providerUser->getName(),
                        'profile_path' => $profilePicName
                    ]);

                }
                $account->user()->associate($user);
                $account->save();
                return $user;
            }    
        }

【问题讨论】:

    标签: laravel facebook-graph-api laravel-socialite


    【解决方案1】:

    您可以使用 UUID 生成器,而不是使用 md5。这个问题的原因之一是因为 md5 为相同的输入生成相同的哈希。例如,当您通过 md5(111) 时,它将生成 698d51a19d8a121ce581499d7b701668。因此,如果您为不同的用户生成相同的哈希键,则最新的图像配置文件将占据一席之地,前者将被后者取代。

    场景: 用户1:

    $profilePicName = md5(111) . ".jpg";
    $contents = file_get_contents( $providerUser->avatar_original );
    Storage::disk('local')->put( 'profiles/' . $profilePicName, $contents );
    $user = User::create([
                'email' => $providerUser->getEmail(),
                'name' => $providerUser->getName(),
                'profile_path' => $profilePicName
                        ]);
    

    场景: 用户2:

    $profilePicName = md5(111) . ".jpg";
    $contents = file_get_contents( $providerUser->avatar_original );
    Storage::disk('local')->put( 'profiles/' . $profilePicName, $contents );
    $user = User::create([
                'email' => $providerUser->getEmail(),
                'name' => $providerUser->getName(),
                'profile_path' => $profilePicName
                        ]);
    

    现在他们的个人资料中都保存了 698d51a19d8a121ce581499d7b701668.jpg。在这种情况下,第一个用户配置文件将与第二个用户图像配置文件相同。

    【讨论】:

    • 是的,但它设置为每次生成一个随机数,这个随机数肯定不会这么频繁出现
    • 你永远不会知道,这个随机数在 1 到 10000 之间 1- 所以你只能限制 10000 人 2- 如果你为此代码编写一个测试,它肯定会生成在某些时候相同的哈希码,它可能在第 10 次迭代或第 100 次迭代。所以我想说的是,用这个公式拥有一个唯一的哈希码是不可信的。
    • 公平点的哥们,我想我只是对哈希生成的频率感到惊讶。
    猜你喜欢
    • 2021-01-25
    • 2016-11-12
    • 2015-08-15
    • 2020-03-16
    • 1970-01-01
    • 2016-07-11
    • 2019-06-15
    • 2017-04-18
    • 2020-05-13
    相关资源
    最近更新 更多