为啥 $helper->getSessionFromRedirect() 总是返回 NULL?

Posted

技术标签:

【中文标题】为啥 $helper->getSessionFromRedirect() 总是返回 NULL?【英文标题】:Why is $helper->getSessionFromRedirect() always returning NULL?为什么 $helper->getSessionFromRedirect() 总是返回 NULL? 【发布时间】:2015-05-12 22:58:21 【问题描述】:

我有这段代码,它运行了好几个月。突然,生产环境停止工作,$helper->getSessionFromRedirect() 现在总是返回 NULL 值。

登录表单页面 (index.php)

require 'vendor/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication(123456, 'a1b2c3d4e5');

$helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');
$scope = array('email');
$loginUrl = $helper->getLoginUrl($scope);

echo '<a href="'.$loginUrl.'">Login</a>';

登录处理 (login.php)

require 'vendor/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication(123456,'a1b2c3d4e5');

$helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');

try 
    # success
    $session = $helper->getSessionFromRedirect();
 catch(FacebookRequestException $ex) 
    # when Facebook returns an error
 catch(\Exception $ex) 
    # when validation fails or other local issues


if($session) 
    # do something with user data
    $me = (new FacebookRequest($session, 'GET', '/me'))->execute()->getGraphObject(GraphUser::className());

    # redirect to user profile page
    header('Location: http://domain.com/profile.php');
    exit();
 else 
    # $session is always NULL with this code :(

这个正在在我的测试应用上运行,但它在我的生产应用 ID 上不起作用。当然,它们之间的唯一区别是 App ID 和 Secret ID 值。我已经确定我在关注Facebook instructions。另外,我用的是Facebook PHP SDK 4的最新版本。

【问题讨论】:

【参考方案1】:

经过长时间的诊断,我发现存在差异。由于我使用的是 Cloudflare 的 SSL 功能,所以最初的 $helper = new FacebookRedirectLoginHelper('http://domain.com/login.php'); 请求是使用 http:80 发出的,但第二个 $helper = new FacebookRedirectLoginHelper('http://domain.com/login.php'); 是使用 https:443 发出的……这会向 Facebook 返回一个不匹配的签名,这会导致$session 变量中的 NULL 值。

TL;DR在向 fb 发出请求时不要混合使用 http 和 https。

【讨论】:

谢谢,这不完全是我的问题,但它给了我一个想法。我在没有 www 的情况下访问该网站,并且 facebook 被重定向到 www。不知道这很重要

以上是关于为啥 $helper->getSessionFromRedirect() 总是返回 NULL?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点?

java 把数据放入session时为啥会 报null异常?

为啥servlet跳转报错404

build-helper-maven-plugin

build-helper-maven-plugin

request.getSession() 和 request.getSession(true) 的区别