Laravel 5在AbstractProvider.php中获取InvalidStateException
我正在尝试使用社交功能登录laravel 5中的facebook 这是我的路线文件代码Laravel 5在AbstractProvider.php中获取InvalidStateException,php,facebook,laravel,laravel-5,Php,Facebook,Laravel,Laravel 5,我正在尝试使用社交功能登录laravel 5中的facebook 这是我的路线文件代码 Route::get('fb', function ($facebook = "facebook") { $provider = \Socialize::with($facebook); if (Input::has('code')) { $user = $provider->user(); return var_dump($user)
Route::get('fb', function ($facebook = "facebook")
{
$provider = \Socialize::with($facebook);
if (Input::has('code'))
{
$user = $provider->user();
return var_dump($user);
} else {
return $provider->scopes(['public_profile','user_friends'])->redirect();
}
});
登录成功,我得到了代码,但是get$provider->user()的时间我得到了错误
AbstractProvider.php第161行中的InvalidStateException
我找到了暂时的解决办法
public function user()
{
//if ($this->hasInvalidState()) {
// throw new InvalidStateException;
//}
$user = $this->mapUserToObject($this->getUserByToken(
$token = $this->getAccessToken($this->getCode())
));
return $user->setToken($token);
}
在AbstractProvider.php文件中注释$this->hasvalidState() 我不喜欢仅仅注释掉表示错误的代码(如@Dipesh Shihora的回答),所以我进一步挖掘了一下。我发现这个错误(至少在我的例子中)是由会话问题引起的
我的开发服务器是根据中给出的说明设置的。基本上,我是在“欺骗”谷歌,使用一个回调URL,看起来像一个公开访问的地址
我出现了InvalidStateException
问题,因为我在http://localhost/login
并重定向到谷歌的登录页面,然后返回到http://myapp.example.com/callback
。问题是会话密钥存储在cookie中-它最初是http://localhost
,但当我重定向到其他URL时,cookie(以及会话密钥)无法访问。因此,更新后会话状态
值不存在,引发异常
解决方案是什么?确保我在dev机器上的所有浏览都是在http://myapp.example.com
而不是在http://localhost
因此,在做了一些挖掘之后,如果发现我的问题是nginx配置错误,url参数(代码和状态)没有正确地传递到index.php文件,因此会话状态和url状态之间的检查失败。
我修改了我的nginx配置,使其看起来像这样,并且工作得很好
location / {
try_files $uri $uri/ /index.php?$args;
}
也许这是更好的临时解决方案我不知道这是否对任何人都有帮助,但将我的会话驱动程序从文件
更改为cookie
为我解决了无效例外问题。您之所以会出现此错误,是因为您的配置文件中的社交提供商设置错误,或者没有设置Facebook应用程序正确
访问developers.facebook.com,确保您的应用程序id和密钥正确,并且指向正确的URL。然后确保使用正确的重定向、id和密码更新了laravel应用程序的services.php配置文件。尝试在config/session.php的'domain'
字段和config/app.php的'url'
字段中设置正确的值。这似乎对我起了作用。我注意到session.php
中的值应该不带http://
,而app.php
中的值应该带http://
此外,我建议您遵循以下指南:。这非常有帮助且清晰。对于遇到这些问题的任何人,您可以将config/session.php中的域值设置为您的域,并清除浏览器中与应用程序url相关的所有cookie。然后还可以运行php artisan cache:clear和clear Compliated转到供应商/guzzlehttp/guzzle/src/Client.php
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false
];
改为
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => **false**,
'cookies' => false
];
它在我的网站上工作,只需在获取用户之前调用->无状态()
Socialite::driver('facebook')->stateless()->user()
Socialite::driver('google')->stateless()->user()
我知道这篇文章有点老了,但我在寻找可能的答案时一直在点击它
我也犯了同样的错误,但我的解决方案有点不同
我在Ubuntu18.04桌面上开发,因为它是一个带有GUI的服务器。Socialite在本地工作得很好,但当我通过git将更改推/拉到服务器时,它就退出了
我通过记录发送到谷歌和从谷歌发送的信息来进行跟踪。我“dd($_GET)”是为了在社交名媛有机会获得信息之前获得一个原始转储,这样我就知道存储了什么,准备使用什么了。所有的信息都在那里,但社交名流似乎并没有“看到”它。当时我推断是我的apache2头配置干扰了Cookie/会话数据
我在apache2配置中设置了头安全性。其中一个设置是
Header always edit Set-Cookie ^(.*) "$1;HttpOnly;Secure;SameSite=Strict"
此设置干扰了社交名流所需的cookie信息。我从apache2头配置中删除了该设置(通过注释),并重新启动了Apache。最后,我删除了storage/framework/session/*中的所有会话,并将它们从浏览器中清除,以确保安全。这对我很管用
在我让它工作后,一个接一个地启用并测试了以下设置,以确保框架能够保护它可以保护的标题信息:
SESSION_SECURE_COOKIE=true
在my.env文件中
'http\u only'=>true,
和
“同一站点”=>“lax”
(设置为“严格”似乎不起作用)
在我的config/session.php文件中
现在,它又回到了安全性测试和必要时的调整上。确保将带有url参数(代码和状态)的查询字符串传递给fpm/mod_php:
# AbstractProvider.php, line 242
...
protected function hasInvalidState()
{
if ($this->isStateless()) {
return false;
}
--> dd($this->request); <--
$state = $this->request->session()->pull('state');
return ! (strlen($state) > 0 && $this->request->input('state') === $state);
}
...
确保在fastcgi\u params
文件中设置了参数QUERY\u STRING
:
# /etc/nginx/includes/fastcgi_params
...
fastcgi_param QUERY_STRING $args;
...
# example.com.conf
location ~ \.php$ {
fastcgi_pass fpm:9000;
fastcgi_index index.php;
...
include /etc/nginx/includes/fastcgi_params;
...
}
@Olsen AbstractProvider.php是默认文件。。。!我发现问题在于AbstractProvider.php文件中的$this->request->getSession()->->ger('state')
返回空值。有更好的解决方案吗?您不应该注释掉导致错误的代码,而应该修复错误。否决。@Mattias那么你能给我解决方案吗?@Dipeshhihora我还没有时间找到最终可行的解决方案,没有。不过我找到了一些线索,例如设置会话Cookie域,然后清除应用程序缓存,或者将请求类注入handleProviderCallback,如下所示:handleProviderCallback(illumb\Http\Request$Request)。但就像我说的,我没有试过
# example.com.conf
location / {
try_files $uri $uri/ /index.php?$args;
}
# /etc/nginx/includes/fastcgi_params
...
fastcgi_param QUERY_STRING $args;
...
# example.com.conf
location ~ \.php$ {
fastcgi_pass fpm:9000;
fastcgi_index index.php;
...
include /etc/nginx/includes/fastcgi_params;
...
}