Oauth登录无效 - 重定向次数过多(ERR_TOO_MANY_REDIRECTS)

时间:2018-03-06 22:25:47

标签: php laravel oauth

我有这条路线的facebook登录按钮:

<a href="{{route('social.auth',['provider' => 'facebook'])}}"  

style="background-color: #3b5998; color:white;"> 
 <i class="fa fa-facebook" aria-hidden="true"></i> Login</a>

单击该按钮时,用户将被重定向到“http://proj.test/auth/facebook/callback?code=...=

但这似乎是一个错误:

Page is not working, proj.test redirect too many times. ERR_TOO_MANY_REDIRECTS.

你知道哪里可以出错吗?

路线:

Auth::routes();


Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@redirectToProvider',
    'as'   => 'social.auth'
]);

Route::get('auth/{provider}/callback', [
    'uses' =>   'OauthController@redirectToProvider',
    'as' => 'social.auth'
]);
`

OAuthcontroller:

class OauthController extends Controller

{
    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();

    }
    public function handleProviderCallback()
    {
        $user = Socialite::driver('facebook')->user();

        return $user->getEmail();

        // $user->token;
    }
}

在App域中我有:

proj.test

在网站网址中

http://proj.test/
http://proj.test/facebook/auth/callback

2 个答案:

答案 0 :(得分:1)

您的两条路线都指向redirectToProvider方法。变化

Route::get('auth/{provider}/callback', 'OauthController@redirectToProvider');

Route::get('auth/{provider}/callback', 'OauthController@handleProviderCallback');

答案 1 :(得分:1)

一开始你有:

Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@redirectToProvider',
    'as'   => 'social.auth'
]);

Route::get('auth/{provider}/callback', [
    'uses' =>   'OauthController@redirectToProvider',
    'as' => 'social.auth'
]);

这就是你获得Page is not working, proj.test redirect too many times. ERR_TOO_MANY_REDIRECTS.例外的原因。用户被重定向到提供者登录页面,在成功登录后,他返回到... redirectToProvider!在几秒钟和子序列中调用redirectToProvider您已经成功记录,因此登录窗口不会出现,并且提供者(脸谱)立即重定向回redirectToProvider方法,故事会在浏览器抛出异常时重复。

正如@btl所提到的,你有两条相等的路线,所以你把它改成了:

Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@redirectToProvider',
    'as' => 'social.auth'
]);

Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@handleProviderCallback',
    'as' => 'social.auth'
]);

现在你有2条路由指向redirectToProvider和handleProviderCallback方法,但是... handleProviderCallback覆盖了第一条路线。您无法使用相同的方法定义2条路线(在本例中为get)共享相同的uri 。将第一个更改为例如auth/{provider}。在第二个中删除'as' => 'social.auth'部分(路线名称必须是唯一的)。

因此,当您单击登录按钮时,您将转到handleProviderCallback,Scialite会检测到该状态无效,这就是您获得Laravel \ Socialite \ Two \ InvalidStateException No message异常的原因。在redirectToProvier方法中,Socialite在会话中存储状态值,并通过?state=...查询参数将其传递给提供程序。成功登录facebook后重定向到回调网址,其状态与redirectToProvider方法相同(在引擎盖下实现)。 Socialite将从提供程序检索到的状态与存储在会话中的状态进行比较,如果状态不同,则抛出上述异常。因为你直接转到handleProviderCallback,你得到的空状态值永远不会与会话中存储的值匹配(即使会话是空的)。

纠正路线:

Route::get('auth/{provider}', [
    'uses' => 'OauthController@redirectToProvider',
    'as' => 'social.auth'
]);

Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@handleProviderCallback',
]);