用户取消应用请求后,Laravel 5 Socialite Facebook 登录错误处理回调

Posted

技术标签:

【中文标题】用户取消应用请求后,Laravel 5 Socialite Facebook 登录错误处理回调【英文标题】:Laravel 5 Socialite Facebook Login Error handling on callback after user cancels app request 【发布时间】:2016-09-30 17:20:31 【问题描述】:

我有一个带有 Socialite 的 Laravel 5 网络应用程序,可以使用 Facebook 帐户登录我的用户。

这是我的回调函数:

public function callback(SocialAccountService $service)


    $user = $service->createOrGetUser(Socialite::driver('facebook')->user());

    auth()->login($user);

    return redirect()->to('/home');

这是我的 SocialAccountService,基本上该函数返回用户(如果存在)或创建一个新用户:

class SocialAccountService

    public function createOrGetUser(ProviderUser $providerUser)
    
        $account = SocialAccount::whereProvider('facebook')
            ->whereProviderUserId($providerUser->getId())
            ->first();

        if ($account) 
            return $account->user;
         else 

            $account = new SocialAccount([
                'provider_user_id' => $providerUser->getId(),
                'provider' => 'facebook'
            ]);

            $user = User::whereEmail($providerUser->getEmail())->first();

            if (!$user) 

                $user = User::create([
                    'email' => $providerUser->getEmail(),
                    'name' => $providerUser->getName(),
                ]);
            

            $account->user()->associate($user);
            $account->save();

            return $user;

        

    

现在的问题是,我可以让我的用户通过 Facebook 成功登录,但是当用户在 FB 对话框上单击取消以获得权限时,它会中断。

我该如何处理这个错误?我可以在 URL 框中看到错误消息,但不知道如何处理它们。

P.S 我对 Laravel 和 Socialite 还很陌生

【问题讨论】:

路由写对了吗? Route::get('/callback', 'SocialAuthController@callback');这是我写的路由,用户也可以正常登录,但是如果新用户取消权限对话框,就会出现我无法处理的错误 您为 get 方法编写路由,但我在这里看到请求带有 post 方法 github.com/laravel/socialite 详情见这里 【参考方案1】:

callback(...) 方法中,您可以检查是否存在“代码”输入字段,如果不存在则重定向到错误的登录页面。

示例:

function callback(SocialAccountService $service ,Request $request) 
    if (! $request->input('code')) 
        return redirect('login')->withErrors('Login failed: '.$request->input('error').' - '.$request->input('error_reason'));
    

    // rest of your code
    

【讨论】:

我认为输入 error_reason 已被 error_description 替换。【参考方案2】:

尝试 catch 是最好的做法(它会捕获所有异常)

 try

    $userSocial =Socialite::driver('facebook')
    ->stateless()->user();
    dd($userSocial);
 
catch (\Throwable $e)  

//handle error here for php 7 or 8  

   catch (\Exception $e)  
  // for php 5
  handle error here 

  

【讨论】:

以上是关于用户取消应用请求后,Laravel 5 Socialite Facebook 登录错误处理回调的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 安排推送通知并在必要时取消它

[ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件

(axios) HTTP POST 请求两分钟后失败,Laravel 5 + VueJS

在 laravel 5.3 中重定向回请求的页面

取消向服务器发送删除请求的操作后,应用程序崩溃

OAuth回调后Laravel访问JWT