【问题标题】:Laravel 5.1 & Socialite - How to connect Facebook/Twitter details to currently authenticated userLaravel 5.1 和 Socialite - 如何将 Facebook/Twitter 详细信息连接到当前经过身份验证的用户
【发布时间】:2016-05-01 11:07:29
【问题描述】:

我已经很好地实施了社交名流,并且适用于新用户或与我的应用程序数据库中的电子邮件地址具有相同 Facebook 电子邮件地址的用户。

但是,有些用户的 Facebook 电子邮件帐户与他们在我的应用中使用的帐户不同。我想允许用户在登录时将他们的 Facebook 个人资料连接到他们的应用帐户。

这是我的路线:

Route::get('login/{provider}', 'Auth\AuthController@redirectToProvider');
Route::get('login/{provider}/callback', 'Auth\AuthController@handleProviderCallback');

redirectToProvider 代码:

public function redirectToProvider($provider)
{
    return Socialite::driver($provider)->redirect();
}

以下是我当前处理社交名流用户创建/更新的代码:

public function handleProviderCallback($provider)
    {
        $user = Socialite::driver($provider)->user();

        $user_query = User::where('email', $user->email)
            ->orWhere('oauth_facebook_id', $user->id)
            ->orWhere('oauth_twitter_id', $user->id)
            ->get();

        if($user_query->count() > 0) {

            $the_user = $user_query->first();

            if($provider === 'facebook') {
                $the_user->oauth_facebook_id = $user->id;
            }

            if($provider === 'twitter') {
                $the_user->oauth_twitter_id = $user->id;
            }

            $the_user->avatar = $user->avatar;

            $the_user->save();

            \Auth::login($the_user, true);

            return redirect('/dashboard');
        }

        $new_user = User::create([
            'name' => $user->name,
            'email' => $user->email,
            'oauth_facebook_id' => $provider === 'facebook' ? $user->id : NULL,
            'oauth_twitter_id' => $provider === 'twitter' ? $user->id : NULL,
            'avatar' => $user->avatar,
            'confirmed' => true,
            'gender' => $user->user['gender'],
        ]);

        \Auth::login($new_user, true);

        flash()->success('Success!', 'Your account has been created using your '.ucfirst($provider).' details!');
        return redirect('/dashboard');
    }

将返回的详细信息与当前经过身份验证的用户联系起来的最佳方法是什么?

提前致谢:)

【问题讨论】:

    标签: php laravel laravel-5.1 laravel-socialite


    【解决方案1】:

    只需检查用户是否已登录,然后使用提供者 ($userData->id) 返回的数据更新该用户的 oauth_{provider}_id

    否则,使用返回的数据创建一个新用户。

    类似这样的:

    public function handleProviderCallback($provider)
    {
        $userData = Socialite::driver($provider)->user();
    
        if(Auth::check()) {
    
            $user = User::find(Auth::user()->id);
    
            if($provider === 'facebook') {
                $user->oauth_facebook_id = $userData->id;
            }
    
            if($provider === 'twitter') {
                $user->oauth_twitter_id = $userData->id;
            }
    
            $user->save();
    
        } else {
    
            $new_user = User::create([
                'name' => $userData->name,
                'email' => $userData->email,
                'oauth_facebook_id' => $provider === 'facebook' ? $userData->id : NULL,
                'oauth_twitter_id' => $provider === 'twitter' ? $userData->id : NULL,
                'avatar' => $userData->avatar,
                'confirmed' => true,
                'gender' => $userData->user['gender'],
            ]);
    
            \Auth::login($new_user, true);
    
            flash()->success('Success!', 'Your account has been created using your '.ucfirst($provider).' details!');
    
        }
    
        return redirect('/dashboard');
    }
    

    【讨论】:

    • 最好的方法是什么?我试图在我的代码中做一个if(Auth::check()) 块,但由于用户已经登录,它完全绕过它。
    • 我已经尝试过代码。当用户登录并且我转到 domain.dev/login/facebook(我的 URI 来触发社交名流代码)时,它只会自动将我重定向到仪表板并且根本不会更新该行
    • @AndyHolmes 它会立即重定向您吗?还是在上 Facebook 之后?
    • 马上就看不到脸书了
    • 完成,很简单:)
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多