Laravel и Dropbox WebAuth: «Отсутствует токен CSRF в сеансе»

Я использую Laravel 5.0 и пытаюсь авторизовать с помощью Dropbox. Я свободно следую этому примеру: http://dropbox.github.io/dropbox-sdk-php/api-docs/v1.1.x/class-Dropbox.WebAuth.html

Когда я иду / начинаю. Я перенаправляюсь в Dropbox и нажимаю «Разрешить», но когда я перенаправляюсь обратно / заканчиваю, я продолжаю получать пропущенный токен 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; } 

Обновление 1:

Хорошо, поэтому я попытался заставить его работать с Laravel Socialite и поставщиком Dropbox Socialite . Я изменил свой код на то, что ниже, но я получаю сообщение об ошибке, когда я нажимаю / запускаю. 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" }, 

контроллер

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

конфиг / app.php

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

приложение / Провайдеры / EventServiceProvider.php

 protected $listen = [ 'SocialiteProviders\Manager\SocialiteWasCalled' => [], ]; 

Обновление 2:

Я понял это, я добавил это, и это сработало.

приложение / Провайдеры / EventServiceProvider.php

 protected $listen = [ 'SocialiteProviders\Manager\SocialiteWasCalled' => [ 'SocialiteProviders\Dropbox\DropboxExtendSocialite@handle', ], ]; 

Related of "Laravel и Dropbox WebAuth: «Отсутствует токен CSRF в сеансе»"

Зачем изобретать колесо, если у вас есть обертка, которая может это сделать для вас:

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

Причина в том, что маршруты POST защищены CSRF . Если вы не хотите использовать оболочку, вам необходимо отключить этот уровень безопасности, но никто не рекомендовал бы этого.

Еще лучше использовать Laravel Socialite . Только тот факт, что Dropbox в нем не поддерживается, но этот пакет решит это.

Кредиты для ceejayoz за помощь в этом!

Примечание. Использование пакета Dropbox, как в ответе @ Blaatpraat, как правило, является лучшей идеей, чем эта. Если вы устарели, используя свою собственную логику:

Laravel 5 POST маршрутов (Dropbox отправляется вам в конце процесса) по умолчанию защищен промежуточным программным обеспечением защиты CSRF . Поскольку Dropbox не знает маркер CSRF приложения Laravel (и не знает его для отправки), параметр _token отсутствует и не выполняется промежуточное программное обеспечение.

Вам нужно будет изменить app/Http/Middleware/VerifyCsrfToken.php чтобы освободить этот маршрут. Где он говорит:

 return parent::handle($request, $next); 

Вам нужно что-то подобное, чтобы обойти проверку CSRF на определенных маршрутах:

 if(\Request::is('finish') { return $next($request); } return parent::handle($request, $next);