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

Обновление 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',
],
];

3

Решение

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

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

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

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

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

1

Другие решения

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

Ларавел 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);
1

По вопросам рекламы [email protected]