Laravel和Dropbox WebAuth:“会话中缺少CSRF令牌”

Sta*_*see 5 php dropbox laravel-5

我正在使用Laravel 5.0,并尝试使用Dropbox进行授权。我大致遵循以下示例:http : //dropbox.github.io/dropbox-sdk-php/api-docs/v1.1.x/class-Dropbox.WebAuth.html

当我去/开始。我被重定向到Dropbox并单击“允许”,但是当我被重定向回/ finish时,我在会话中不断收到Missing CSRF令牌。有人有什么想法吗?我读过这$_SESSION在Laravel中不起作用,但是我不确定该怎么做。

这是我正在使用的代码:

public function start()
{   
    $authorizeUrl = $this->getWebAuth()->start();

    return redirect()->away($authorizeUrl);
}

public function finish()
{       
    $test = $this->getWebAuth()->finish($_GET);

    dd($test);
}

private function getWebAuth()
{   
    $appKey = 'key';
    $appSecret = 'secret';
    $appName = 'name';
    $appRedirect = 'http://example.com/finish';

    $appInfo = new Dropbox\AppInfo($appKey, $appSecret);
    $csrfTokenStore = new Dropbox\ArrayEntryStore($_SESSION, 'dropbox-auth-csrf-token');
    $webAuth = new Dropbox\WebAuth($appInfo, $appName, $appRedirect, $csrfTokenStore);

    return $webAuth;
}
Run Code Online (Sandbox Code Playgroud)

更新1:

好的,所以我尝试与Laravel SocialiteDropbox Socialite提供程序一起使用。我将代码更改为以下代码,但按/ start时出现错误。Driver [dropbox] not supported。我对说明的第3步感到非常困惑,所以也许我在这里做错了。

composer.json

"require": {
    "laravel/framework": "5.0.*",
    "dropbox/dropbox-sdk": "1.1.*",
    "laravel/socialite": "~2.0",
    "socialiteproviders/dropbox": "~1.0"
},
Run Code Online (Sandbox Code Playgroud)

控制者

use Socialite;

class ExampleController extends Controller {

    public function start()
    {   
        return Socialite::with('dropbox')->redirect();
    }

    public function finish()
    {       
        $user = Socialite::with('dropbox')->user();

        dd($user->token);
    }
}
Run Code Online (Sandbox Code Playgroud)

config / app.php

'providers' => [
    //'Laravel\Socialite\SocialiteServiceProvider',
    'SocialiteProviders\Manager\ServiceProvider',
],

'aliases' => [
    'Socialite' => 'Laravel\Socialite\Facades\Socialite',
],
Run Code Online (Sandbox Code Playgroud)

app / Providers / EventServiceProvider.php

protected $listen = [
    'SocialiteProviders\Manager\SocialiteWasCalled' => [],
];
Run Code Online (Sandbox Code Playgroud)

更新2:

我弄清楚了,我添加了它,它奏效了。

app / Providers / EventServiceProvider.php

protected $listen = [
    'SocialiteProviders\Manager\SocialiteWasCalled' => [
        'SocialiteProviders\Dropbox\DropboxExtendSocialite@handle',
    ],
];
Run Code Online (Sandbox Code Playgroud)

Bla*_*aat 3

如果您有一个可以为您完成此操作的包装器,为什么要重新发明轮子:

https://github.com/GrahamCampbell/Laravel-Dropbox

原因是 POST 路由受到保护CSRF. 如果您不想使用包装器,则需要禁用此安全层,但没有人会建议这样做。

更好的是使用Laravel Socialite。唯一的事实是,Dropbox 本身并不支持,但这个包将解决这个问题。

感谢ceejayoz对此提供的帮助!