【发布时间】:2015-10-18 09:40:02
【问题描述】:
虽然这个问题是关于一个特定的包,但它应该与其他包相关,因为它实际上是关于 Laravel 框架中的哪个位置可以正确捕获以下情况。
我正在使用eloquent-oauth 启用通过linkedin 和facebook 登录到我的应用程序。
授权和登录都可以单独工作。
但是,如果我之前通过一个社交平台授权并登录,然后尝试通过另一个社交平台进行授权,我会收到一个 PDO 异常,即插入在我的用户表上的唯一电子邮件约束上失败。
我应该在哪里进行插入?
我可以看到我可以直接将代码添加到供应商文件夹中,但我认为这不是一个好习惯,因为如果我将来升级包肯定会被覆盖?
我目前正在做的是在登录功能中的 vendor/adamwathan/eloquent-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
}
});
我想如果我保留插入的用户检查供应商文件,我只需要更新那些,如果我更新包?
但是有没有比我做的更好的方法呢?
【问题讨论】:
标签: php oauth error-handling laravel-5