我正在使用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);