我有一个奇怪的问题, 我想不通. 我正在使用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;
}
}
而不是使用md5, 你可以使用UUID生成器. 例如,当你传递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
]);
场景: User2:
$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 保存在他们的配置文件中。而在这种情况下,第一个用户资料将与第二个用户图片资料相同。