【问题标题】:Eloquent-oauth - catching PDO ExceptionEloquent-oauth - 捕获 PDO 异常
【发布时间】: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


    【解决方案1】:

    好的,所以我添加了一个 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);
    }   
    });
    

    【讨论】:

    • 好吧,就是这么简单的解决方案 - 我想我正忙于尝试访问用户信息!
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 2012-05-20
    • 2017-03-22
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多