我试图用Laravel实施社交登录。一切似乎还可以。用户可以登录。但是问题是与Facebook&Google 也登录。因此,我不想让同一电子邮件登录。如何实施社会登录的验证规则?这是我试图验证的代码,但它抛出了$validator
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
public function handleProviderCallback($provider,Request $request)
{
if (!$request->has('code') || $request->has('denied'))
{
return redirect('/');
}
$user = Socialite::driver($provider)->user();
$authUser = $this->findOrCreateUser($user, $provider);
Auth::login($authUser, true);
}
public function findOrCreateUser($user, $provider)
{
$authUser = User::where('provider_id', $user->id)->first();
if ($authUser)
{
return $authUser;
}
$validator = Validator::make($user->toArray(), [
'email' => 'max:255|unique:users',
]);
if ($validator->passes())
{
return User::create([
'name' => $user->name,
'email' => $user->email,
'provider' => $provider,
'provider_id' => $user->id,
]);
}
return Redirect::to('login')->with('errors',$validator->errors());
}
我并不真正理解您的问题,但我试图重构您的功能
public function findOrCreateUser($user, $provider)
{
$authUser = User::where('provider_id', $user->getId())->first();
if ($authUser)
{
return $authUser;
}
$email = User::where('email', $user->getEmail())->first();
if (! $email)
{
return User::create([
'name' => $user-> getName(),
'email' => $user-> getEmail(),
'provider' => $provider,
'provider_id' => $user->getId(),
]);
}
return Redirect::to('login')->with('errors',"Sorry ! This email Already Exists");
}
我不明白这个问题,但这是我对您需要的猜测。
我的猜测:您想将电子邮件保留在用户表中。
您可以创建一个额外的表,以保留名为"连接帐户"的社交登录方法的记录。将基本用户信息保留在用户表中,然后将社交帐户链接到用户表中的同一电子邮件记录。您可以根据用户表进行登录,并在连接的帐户表中添加不同的社交登录帐户。
用户表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username');
$table->string('firstname');
$table->string('lastname')->nullable();
$table->string('email')->unique();
$table->string('password')->nullable();
$table->rememberToken();
$table->timestamps();
});
连接的会计表
Schema::create('connected_accounts', function(Blueprint $table){
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('account_type');
$table->string('provider')->nullable();
$table->string('provider_id');
$table->text('token')->nullable();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
});
查找或创建用户代码(如果用户存在添加社交登录信息到连接的帐户else else ellust user user用户并将社交登录信息添加到已连接的帐户(:
public function findOrCreateUser($user, $provider) {
$userExists = User::where('email', $user->email)->first();
if($userExists) {
$connectedAccount = ConnectedAccount::where('provider_id', $user->id)->first();
if ($connectedAccount) {
return $connectedAccount->user;
}
else{
$connectedAccount = new ConnectedAccount();
$connectedAccount->user_id = $userExists->id;
$connectedAccount->account_type = 'social';
$connectedAccount->provider = $provider;
$connectedAccount->token = $user->token;
$connectedAccount->provider_id = $user->id;
$connectedAccount->save();
return $userExists;
}
}
else{
$firstName = '';
$lastName = '';
if($provider == 'facebook'){
$name = explode(' ',$user->name);
$firstName = $name[0];
$lastName = $name[1];
$profile_pic = $user->avatar_original;
}
else if($provider == 'google'){
$firstName = $user->user['name']['givenName'];
$lastName = $user->user['name']['familyName'];
$profile_pic = $user->avatar_original;
}
else if($provider == 'linkedin'){
$firstName = $user->user['firstName'];
$lastName = $user->user['lastName'];
$profile_pic = $user->avatar_original;
}
else if($provider == 'github'){
$name = explode(' ',$user->name);
$firstName = $name[0];
if(isset($name[1])){
$lastName = $name[1];
}
$profile_pic = $user->avatar;
}
$uploadedPic = $this->transferProfilePicture($profile_pic);
$userNew = User::create([
'firstname' => $firstName,
'lastname' => $lastName,
'username' => md5($user->email),
'email' => $user->email,
'profile_pic' => $uploadedPic,
'is_verified' => 1
]);
$connectedAccount = new ConnectedAccount();
$connectedAccount->user_id = $userNew->id;
$connectedAccount->account_type = 'social';
$connectedAccount->provider = $provider;
$connectedAccount->token = $user->token;
$connectedAccount->provider_id = $user->id;
$connectedAccount->save();
return $userNew;
}
}