我正在使用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 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',
],
];
答案 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的帮助!