Laravel和Dropbox WebAuth:"在会话中缺少CSRF令牌"

时间:2015-03-24 14:57:03

标签: php dropbox laravel-5

我正在使用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 SocialiteDropbox 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' => [],
];

更新2:

我想通了,我加了这个,但它确实有效。

应用程序/提供者/ EventServiceProvider.php

protected $listen = [
    'SocialiteProviders\Manager\SocialiteWasCalled' => [
        'SocialiteProviders\Dropbox\DropboxExtendSocialite@handle',
    ],
];

2 个答案:

答案 0 :(得分:1)

注意:在@ Blaatpraat的回答中使用Dropbox包通常比这更好。但是,如果您使用自己的逻辑,那么:

Laravel 5 POST路由(Dropbox在流程结束时回复给您)默认受the CSRF protection middleware保护。由于Dropbox不知道您的Laravel应用程序的CSRF令牌(也不知道发送一个),因此缺少_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 :(得分:1)

为什么要重新发明轮子,如果你有一个可以为你做到这一点的包装:

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

原因是POST路由受CSRF保护。如果您不想使用包装器,则需要禁用此安全层,但没有人会建议使用它。

更好的是使用Laravel Socialite。只有这里的事实是Dropbox本身不受支持,但this package将解决这个问题。

ceejayoz的帮助!