Я использую 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',
],
];
Зачем изобретать велосипед, если у вас есть обертка, которая может сделать это для вас:
https://github.com/GrahamCampbell/Laravel-Dropbox
Причина в том, что POST-маршруты защищены CSRF
, Если вы не хотите использовать оболочку, вам нужно отключить этот уровень безопасности, но никто бы не рекомендовал этого.
Еще лучше использует Laravel Socialite. Только факт в том, что Dropbox изначально не поддерживается в нем, но этот пакет решит это.
Кредиты для ceejayoz за помощь в этом!
Замечания: Использование пакета 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);