Хотя этот вопрос касается конкретного пакета, он должен иметь отношение к другим пакетам, поскольку это действительно то, где в рамках Laravel правильно ловушка для ситуации ниже.Eloquent-oauth - catching PDO Exception
Я использую eloquent-oauth, чтобы разрешить вход через linkedin и facebook в мое приложение.
Авторизация и ведение журнала в обеих работают отлично индивидуально.
Однако, если я ранее авторизовался и зарегистрировался через одну социальную платформу, а затем попытаюсь авторизовать с другим, я получаю исключение PDO, которое вставка терпит неудачу при уникальном ограничении электронной почты в моей пользовательской таблице.
Где я должен ловить ловушку для этой вставки?
Я вижу, что я могу добавить код в папку поставщика напрямую, но не думаю, что это хорошая практика, поскольку это, безусловно, будет перезаписано, если я обновил пакет в какой-то момент в будущем?
То, что я сейчас делаю, чтобы добавить проверку пользователя в/файл поставщика/adamwathan/красноречивым-OAuth Src/OAuthManager.php в функции входа
public function login($providerAlias, Closure $callback = null)
{
if (! $this->stateManager->verifyState())
{
throw new InvalidAuthorizationCodeException;
}
$details = $this->getProvider($providerAlias)->getUserDetails();
//start of existing user check
$thisUser = User::where('email', $details->email)->first();
if ($thisUser !== null)
{
$autoOpenModalLogin = true; //instruct the page to open the login modal
return redirect()->guest('home')->with('$autoOpenModalLogin', $autoOpenModalLogin);
}
//end of existing user check
return $this->authenticator->login($providerAlias, $details, $callback);
}
Я думал, что это могло бы быть лучше добавьте его в маршрут где-нибудь - но я не могу помешать этой ошибке. Есть ли что-то еще, что я должен добавить ниже, чтобы поймать ошибку PDO?
Route::get('{provider}/login', function ($provider) {
try {
OAuth::login($provider, function ($user, $userDetails) {
$user->email = $userDetails->email;
$user->name = $userDetails->firstName . ' ' . $userDetails->lastName;
$user->first_name = $userDetails->firstName;
$user->last_name = $userDetails->lastName;
$user->save();
});
return view('home');
} catch (ApplicationRejectedException $e) {
// User rejected application
} catch (InvalidAuthorizationCodeException $e) {
// Authorization was attempted with invalid
// code,likely forgery attempt
}
});
Я думаю, если я держу его вставленный проверку пользователя в файлах поставщика, я просто необходимо обновить их, если я когда-либо обновить пакет?
Но есть ли лучший способ сделать это, чем то, что я сделал?
Хорошо, было такое простое решение - я думаю, я был пойман в попытке получить доступ к информации о пользователе! –