无法检测回调是源自Laravel Socialite中的提供程序

时间:2017-05-14 07:21:40

标签: laravel laravel-5 laravel-socialite

在Socialite文档中,它表示以下行获取用户信息:

$user = Socialite::driver('twitter')->user();

这自然地假设回调来自Twitter。但是,在某些情况下,无意中请求了回调路由,上面的行给出了如下错误:

InvalidArgumentException in TwitterProvider.php line 15:
Invalid request. Missing OAuth verifier.

如何在执行上述行之前检测到回调是从预期的地方(这里是Twitter)发起的?我的日志文件中包含这些错误消息。我认为这些错误来自搜索引擎机器人请求回调路由(Auth机制似乎正常工作)。

5 个答案:

答案 0 :(得分:1)

这里有两个解决方案,一个正是你要求的(如果我没有误解你的问题),还有一个能够解决错误。

检查引荐来源网址

您尝试解决的问题似乎是阻止用户在您的控制器中打开回调方法,以验证呼叫的引荐来源。如果这是您要实现的目标,则可以继续使用

检索HTTP Referrer
$referrer = Request::server('HTTP_REFERER');

解析$ referrer并查看它是否符合您的需求(ex github.com)

$host = parse_url($referrer, PHP_URL_HOST);
if(strpos($host, 'github.com') !== false) {
   // your code here
}

所以,完整的方法可能是这样的

public function callback()
{
    $referrer = Request::server('HTTP_REFERER');
    if($referrer) {
        $host = parse_url($referrer, PHP_URL_HOST);
        if(strpos($host, 'github.com') !== false) {
            $user = Socialite::driver('github')->user();
            // your code here
        }
    }
}

捕获InvalidArgumentException错误

摆脱错误的另一种方法,可能是更好的选择是将代码保存在try / catch块中,如下所示

public function callback()
{
    try {
        $user = Socialite::driver('github')->user();
    } catch (InvalidArgumentException $e) {
        // what will you do if the token is not set?
    }
}

答案 1 :(得分:1)

使用Twitter时,Twitter处理的重定向网址会发送两个查询参数 oauth_token oauth_verifier

因此,您可以添加路由验证以检查URL是否包含参数。

解决方案

在控制器中添加验证

public function yourcallbackfunction()
{
      $v = \Validator::make(request()->all(), [
           'oauth_token' => 'required',
           'oauth_verifier' => 'required'
      ];

     if($v->fails()) {
         //do something as it's not a valid twitter callback
     }else {
         $user = Socialite::driver('twitter')->user();
     }

}

注意:

最好在try catch中处理socialite调用,以捕获社交网站可能抛出的其他错误,例如api上的无效令牌错误或通信错误。

答案 2 :(得分:0)

我认为它应该捕获一般错误。

    try {
        $user = Socialite::driver('twitter')->user();
    } catch (\Exception $e) {
        # do something if nothing works
    }

答案 3 :(得分:-1)

$socialAccount = Socialite::driver('github')->user();

如果您需要当前经过身份验证的用户的帐户详细信息,请使用相同的旧

$user = Auth::user();

答案 4 :(得分:-1)

我真的不太了解你的问题。但我想你想获得提供者名称。

路由应提供提供商的名称(github,facebook,google)

Route::get('/redirect/{provider}', [
    'as' => 'getSocialAuthRedirect',
    'uses' => 'Auth\SocialAuthController@redirect'
]);
Route::get('/callback/{provider}', [
    'as' => 'getSocialAuthCallback',
    'uses' => 'Auth\SocialAuthController@callback'
]);

在控制器中,您可以获得提供者名称

public function callback($provider)
{
    // get provider and do something
}

如果你想从github检测回调,只需要检查$provider == 'GithubProvider'

希望有所帮助!