Я использую Laravel 5.8, PHP 7.3, MongoDB.
Мое приложение может иметь анонимных пользователей, которые уже могут иметь свой идентификатор в базе данных. Они также могут иметь некоторые данные, связанные с user_id.
Моя цель - зарегистрировать анонимного пользователя, сохранив при этом свои данные.
Я переделал стандартную регистрацию Laravel для анонимных пользователей, это не было проблемой.
Теперь я начал входить в социальные сети.
Я сделал Google логин в первую очередь. Логин и регистрация отлично работает для новых пользователей.
Но я даже не представляю, как заставить Google войти в систему для работы с анонимными пользователями, не передав в Google дополнительный параметр.
Я уже пробовал:
Используйте метод с () для передачи необязательного параметра поставщику (Google в моем случае), но нет информации о том, как получить этот дополнительный параметр в запросе обратного вызова от поставщика.
Поэтому я решил, что этот параметр нужен только для проверки некоторых провайдеров, но я не уверен.
Я обнаружил, что ваше приложение может добавлять динамические параметры к 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());
}
Так что я был бы очень рад, если бы кто-нибудь помог мне понять, как я мог передать параметры поставщикам и получить их от поставщиков.
Если мой английский или описание проблемы не совсем понятно, пожалуйста, напишите комментарии, я объясню это по-другому.
Заранее спасибо за ваши идеи!