简体   繁体   English

社交登录验证规则

[英]Validation Rule for social login

I was trying to implement social login with laravel. 我正在尝试使用laravel进行社交登录。 Everything seems OK. 一切似乎都还可以。 User can login . 用户可以登录。 But problem is same email with facebook & google + also logged in. So i don't want to let login with same email. 但是问题是使用Facebook和Google +的同一封电子邮件也已登录。因此,我不想使用同一封电子邮件进行登录。 How do i implement validation rule for social login? 如何实施社交登录验证规则? Here is the code ii was trying for validation but it throws in $validator 这是代码ii尝试进行验证的代码,但它抛出了$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()); 
    }

I didn't really understand your question but i tried to refactor your function 我不太了解您的问题,但我尝试重构您的功能

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"); 
}

I didn't understand the question but here's my guess on what you need. 我不明白这个问题,但这是您所需要的猜测。

My Guess: You want to keep email in users table unique. 我的猜测:您想使用户表中的电子邮件保持唯一。

You can create an additional table to keep records of social login methods named Connected Accounts. 您可以创建一个附加表来保存名为“已连接帐户”的社交登录方法的记录。 Keep basic user info in users table and link the social accounts to the same email record in users table. 将基本用户信息保留在用户表中,并将社交帐户链接到用户表中的同一电子邮件记录。 You give login on the basis of users table and add different social login accounts to connected accounts table. 您可以根据用户表进行登录,然后将不同的社交登录帐户添加到已连接帐户表中。

Users Table 用户表

    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(); 
});

Connected Accounts Table 关联帐户表

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');
        });

Find or Create user code (if user exists add social login information to connected accounts else create user and add social login information to connected accounts): 查找或创建用户代码(如果用户存在,则将社交登录信息添加到关联帐户,否则创建用户并将社交登录信息添加到关联帐户):

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;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM