2015-07-28 3 views
0

Хотя этот вопрос касается конкретного пакета, он должен иметь отношение к другим пакетам, поскольку это действительно то, где в рамках 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 
} 
}); 

Я думаю, если я держу его вставленный проверку пользователя в файлах поставщика, я просто необходимо обновить их, если я когда-либо обновить пакет?

Но есть ли лучший способ сделать это, чем то, что я сделал?

ответ

0

Хорошо, поэтому я добавил в catch для PDOexception и, похоже, именно то, что мне нужно! Сначала проверите его, а затем подтвердите.

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 
} 

catch(PDOException $e){ 
    $autoOpenModalLogin = true; 
    return redirect()->guest('home')->with('$autoOpenModalLogin', $autoOpenModalLogin); 
} 
}); 
+0

Хорошо, было такое простое решение - я думаю, я был пойман в попытке получить доступ к информации о пользователе! –