Как получить дополнительный параметр из Google OAuth? - PullRequest
0 голосов
/ 27 июня 2019

Я использую Laravel 5.8, PHP 7.3, MongoDB.

Мое приложение может иметь анонимных пользователей, которые уже могут иметь свой идентификатор в базе данных. Они также могут иметь некоторые данные, связанные с user_id.

Моя цель - зарегистрировать анонимного пользователя, сохранив при этом свои данные.

Я переделал стандартную регистрацию Laravel для анонимных пользователей, это не было проблемой.

Теперь я начал входить в социальные сети. Я сделал Google логин в первую очередь. Логин и регистрация отлично работает для новых пользователей. Но я даже не представляю, как заставить Google войти в систему для работы с анонимными пользователями, не передав в Google дополнительный параметр.

Я уже пробовал:

  1. Используйте метод с () для передачи необязательного параметра поставщику (Google в моем случае), но нет информации о том, как получить этот дополнительный параметр в запросе обратного вызова от поставщика. Поэтому я решил, что этот параметр нужен только для проверки некоторых провайдеров, но я не уверен.

  2. Я обнаружил, что ваше приложение может добавлять динамические параметры к URL-адресу обратного вызова GitHub, но оно не работает с Google.

Мой код довольно обычный для этой задачи. Я использовал сообщение «Из Google+ API для входа в Google с помощью Laravel Socialite» на laraveldaily.com.

Вот маршруты:

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

Так что я был бы очень рад, если бы кто-нибудь помог мне понять, как я мог передать параметры поставщикам и получить их от поставщиков.

Если мой английский или описание проблемы не совсем понятно, пожалуйста, напишите комментарии, я объясню это по-другому.

Заранее спасибо за ваши идеи!

...