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. Я изменил свой код на приведенный ниже, но при нажатии /запуске я получаю сообщение об ошибке. Driver [dropbox] not supported. Я действительно запутался на шаге 3 инструкций, так что, возможно, я сделал что-то не так там.

композитор.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);
    }
}

config/app.php

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

'aliases' => [
    'Socialite' => 'Laravel\Socialite\Facades\Socialite',
],

app/Providers/EventServiceProvider.php

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

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

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

app/Providers/EventServiceProvider.php

protected $listen = [
    'SocialiteProviders\Manager\SocialiteWasCalled' => [
        'SocialiteProviders\Dropbox\DropboxExtendSocialite@handle',
    ],
];
Author: Staysee, 2015-03-24

2 answers

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

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

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

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

Благодарности ceejayoz за помощь в этом!

 1
Author: Blaatpraat, 2017-05-23 12:16:27

Примечание: Использование пакета 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);
 1
Author: ceejayoz, 2015-03-24 15:11:07