Я использую 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', ], ];
Зачем изобретать колесо, если у вас есть обертка, которая может это сделать для вас:
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);