我有这条路线的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
答案 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',
]);