如何从Google OAuth获取其他参数?

时间:2019-06-27 12:21:20

标签: php laravel authentication oauth laravel-socialite

我使用Laravel 5.8,PHP 7.3,MongoDB。

我的应用程序可能有匿名用户,这些用户的ID已经在数据库中。他们还可能有一些数据已连接到user_id。

我的目标是为匿名用户注册,使他们的数据保持连接。

我为匿名用户重新制作了Laravel的标准注册,这不是问题。

现在,我开始使用社交网络登录。 我首先进行了Google登录。登录和注册非常适合新用户。 但是我什至无法想象如何在不将其他参数传递给Google的情况下使Google登录名与匿名用户一起使用。

我已经尝试过:

  1. 使用with()方法将可选参数传递给提供程序(在我的情况下为Google),但是没有有关如何在提供程序的回调请求中获取此附加参数的信息。 所以我决定只需要对某些提供程序进行一些验证就需要此参数,但是我不确定。

  2. 我发现您的应用程序可以向GitHub回调URL添加动态参数,但不适用于Google。

我的代码通常用于此任务。我在laraveldaily.com上使用了“从Google+ API到使用Laravel Socialite进行Google登录”一文。

这是路线:

Route::get('redirect/{driver}', 
'Auth\LoginController@redirectToProvider')
    ->name('login.provider')
    ->where('driver', implode('|', config('auth.socialite.drivers')));

Route::get('{driver}/callback', 
'Auth\LoginController@handleProviderCallback')
    ->name('login.callback')
    ->where('driver', implode('|', config('auth.socialite.drivers')));

这是将用户重定向到提供程序的功能:

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

这是用于处理来自提供程序的回调的函数:

public function handleProviderCallback($driver)
    {
        try {
            $user = Socialite::driver($driver)
                ->stateless()
                ->user();
        } catch (\Exception $e) {
            return redirect()->route('register');
        }

        $existingUser = User::where('email', $user->getEmail())->first();

        if ($existingUser) {
            auth()->login($existingUser, true);
        } else {
            $newUser                    = new User;
            $newUser->provider_name     = $driver;
            $newUser->provider_id       = $user->getId();
            $newUser->name              = $user->getName();
            $newUser->email             = $user->getEmail();
            $newUser->email_verified_at = now();
            $newUser->avatar            = $user->getAvatar();
            $newUser->save();

            auth()->login($newUser, true);
        }

        return redirect($this->redirectPath());
    }

因此,如果有人可以帮助我了解如何将参数传递给提供程序并将其从提供程序取回,我将感到非常高兴。

如果我的英语或问题描述不是很容易理解,请写评论,我会用另一种方式解释。

提前感谢您的想法!

0 个答案:

没有答案