Kil*_*Bug 5 php facebook-graph-api laravel laravel-5
我正在使用SammyK/Facebook软件包,并面临着通过CSRF登录facebook的问题.之前它运行良好,但后来我不得不在我的kernel.php中禁用CSRF保护,以便顺利运行API.现在我更新了它并在中间件中添加了以下行
public function handle($request, Closure $next) {
$skip = array(
'api/v1/signup',
'api/v1/login',
'api/v1/addContacts',
'api/v1/email'
);
foreach ($skip as $key => $route) {
//skip csrf check on route
if($request->is($route)){
return parent::addCookieToResponse($request, $next($request));
}
}
return parent::handle($request, $next);
}
Run Code Online (Sandbox Code Playgroud)
因此,这允许web和api按预期工作,但由于我已禁用csrf,因此我得到跨站点请求伪造验证失败.当我进行FB登录时,必需的参数"状态"丢失错误.我试图调试并在FacebookRedirectLoginHelper中找到该函数validateCsrf()没有得到savedstate $savedState = $this->persistentDataHandler->get('state');
我不知道如何解决这个问题,理想情况下它现在应该工作.我尝试打印$ state和$ savedState,我得$ savedState为null.
class FacebookController extends Controller {
public function fbConnect(LaravelFacebookSdk $fb)
{
// Obtain an access token.
try {
$token = $fb
->getRedirectLoginHelper()
->getAccessToken();
} catch (Facebook\Exceptions\FacebookSDKException $e) {
dd($e->getMessage());
}
// Access token will be null if the user denied the request
// or if someone just hit this URL outside of the OAuth flow.
if (! $token) {
// Get the redirect helper
$helper = $fb->getRedirectLoginHelper();
if (! $helper->getError()) {
abort(403, 'Unauthorized action.');
}
// User denied the request
dd(
$helper->getError(),
$helper->getErrorCode(),
$helper->getErrorReason(),
$helper->getErrorDescription()
);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
最后,看一下FB代码,我发现问题"跨站点请求伪造验证失败.必需的参数"状态"丢失"和类似物是由PHP变量$ _SESSION ['FBRLH_state']引起的,这是出于一些"奇怪"的原因FB调用login-callback文件.
为了解决这个问题,我在调用函数$ helper-> getLoginUrl(...)之后存储了这个变量"FBRLH_state".在填充变量$ _SESSION ['FBRLH_state']时,只有在调用此函数后才会执行此操作非常重要.
下面是我在login.php中的代码示例:
$uri=$helper->getLoginUrl($uri, $permissions);
foreach ($_SESSION as $k=>$v) {
if(strpos($k, "FBRLH_")!==FALSE) {
if(!setcookie($k, $v)) {
//what??
} else {
$_COOKIE[$k]=$v;
}
}
}
var_dump($_COOKIE);
Run Code Online (Sandbox Code Playgroud)
在调用所有FB代码之前的login-callback.php中:
foreach ($_COOKIE as $k=>$v) {
if(strpos($k, "FBRLH_")!==FALSE) {
$_SESSION[$k]=$v;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,但并非最不重要的是,还记得包含PHP会话的代码,所以..
if(!session_id()) {
session_start();
}
...
...
...
...
<?php session_write_close() ?>
Run Code Online (Sandbox Code Playgroud)
我希望这个回复可以帮助你节省8-10个小时的工作:)再见,亚历克斯.
| 归档时间: |
|
| 查看次数: |
10411 次 |
| 最近记录: |