Laravel和Dropbox WebAuth:;会话中丢失CSRF令牌”;


Laravel and Dropbox WebAuth: "Missing CSRF token in session"

我正在使用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提供商合作。我将代码更改为下面的内容,但当我点击/启动时出现错误。CCD_ 2。我对说明书的第三步感到非常困惑,所以也许我做错了什么。

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);
    }
}

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',
    ],
];

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

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

原因是POST路由受到CSRF的保护。如果你不想使用包装器,你需要禁用这个安全层,但没有人会建议这样做。

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

感谢ceejayoz的帮助!

注意:在@Blaatpraat的回答中使用Dropbox包通常比这更好。如果你已经下定决心使用自己的逻辑,那么:

默认情况下,Laravel 5 POST路由(Dropbox在流程结束时向您发回)由CSRF保护中间件保护。因为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);