2015-03-24 6 views
3

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

Когда я иду/начинаю. Я перенаправляюсь в 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; 
} 

Update 1:

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

Update 2:

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

приложение/Поставщики/EventServiceProvider.php

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

ответ

1

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

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

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

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

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

+0

Это для Laravel 4. В Laravel 5 создание пользовательского адаптера для Socialite, вероятно, лучше. – ceejayoz

+0

Я только что обновил ссылку на версию Laravel 5. – Blaatpraat

+1

Спасибо. https://packagist.org/packages/socialiteproviders/dropbox - это поставщик социальных услуг, который может быть лучше в 5. – ceejayoz

1

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

Laravel 5 POST маршруты (Dropbox отправляет вам обратно в конце процесса) по умолчанию защищаются the CSRF protection middleware. Поскольку 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

Я не думаю, что это правильно. Переадресация в конце потока auth - это GET, а не POST. Сообщение об ошибке из SDK Dropbox, которое пытается проверить, что параметр 'state' в перенаправлении OAuth соответствует выражению CSRF-токена (который был заполнен в' $ _SESSION'). Если '$ _SESSION' не надежно сохраняет токен CSRF, Dropbox SDK не сможет проверить правильность параметра' state'. Я думаю, правильный ответ заключается в использовании словаря сеанса, который фактически работает с Laravel. – smarx

Смежные вопросы