Laravel 5在AbstractProvider.php中获取InvalidStateException

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)

我正在尝试使用社交功能登录laravel 5中的facebook

这是我的路线文件代码

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;
    ...
}