社会登录的验证规则



我试图用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;
        }
    }

最新更新