【发布时间】:2020-05-07 14:09:40
【问题描述】:
我使用社交名流为用户提供使用 facebook 或 github 登录的选项。但是当用户使用 facebook 登录,然后使用 github 登录时,会创建 2 个单独的帐户。所以我的问题是,有没有办法将这两个帐户合并为一个?例如,如果一个用 facebook 登录的用户使用相同的电子邮件地址登录 github,则不会创建新帐户,他们只会登录
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('profile');
$table->string('slug');
$table->string('provider_id');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
登录/注册码
/**
* Redirect the user to the provider authentication page.
*
* @return Response
*/
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
/**
* Obtain the user information from the provider.
*
* @return Response
*/
public function handleProviderCallback($provider)
{
$SocialUser = Socialite::driver($provider)->stateless()->user();
$user = $this -> findOrCreateUser($SocialUser,$provider);
auth()->login($user,true);
return redirect('/');
}
protected function findOrCreateUser($SocialUser,$provider)
{
$user = User::firstOrNew(['provider_id' => $SocialUser->id]);
if ($user->exists) return $user;
$user->fill([
'name' => $SocialUser->nickname?:$SocialUser->name,
'slug' => str_slug($SocialUser->nickname?:$SocialUser->name).'-'.uniqid(),
'email' => $SocialUser->email,
'avatar' => $SocialUser->avatar,
'profile' => Hash::make('no pic'),
'password' => Hash::make('no need for password token based'),
// 'website' => 'add a website',
// 'github_profile' => 'add github profile',
'email_notifications' => 1
])->save();
$user->assignRole('user');
\Mail::to($user)->send(new Welcome($user));
session()->flash('message','Welcome to '.config('app.name').' '.$user->name);
return $user;
}
}
【问题讨论】:
-
嗨,克里斯蒂,你能发布一下你的用户表是什么样子的吗?
-
嗨。刚刚在上面添加了我的用户表
-
你可以做的是,不要只使用一个
provider_id,而是使用facebook_id、github_id和twitter_id分别存储它们 -
嗨,Kristi,您能否添加一些重复数据的示例?
-
@kristitanellari 使用
User::where('email', $SocialUser->email)->first()而不是检查 provider_id
标签: php laravel laravel-socialite