【发布时间】:2015-05-26 16:22:43
【问题描述】:
我正在尝试实现服务器端 PHP facebook 身份验证代码,以配合我的前端 Javascript Facebook 身份验证代码。
为此,我正在抓取当前的 facebook 会话,将其存储到 PGP $_SESSION 数组中,然后使用它进行调用以获取用户的用户名。
在第二次进入这一边时,我检查我们是否在 PHP $_SESSION 数组中存储了 facebook 会话,如果有,我再次使用它来进行调用以获取用户名。这是我在尝试使用存储的会话时收到“给定 __PHP_Incomplete_Class 的实例”错误消息的地方。
我想在页面刷新之间存储 facebook 会话的原因是每当我调用 $session = $helper->getSession();用户第二次登录后,我收到一条消息“此授权码已被使用”。我在某处读到您需要存储 facebook 会话,而不是每次刷新都调用一个新会话,因为 facebook 令牌已经用于获取第一个会话对象。
谁能帮我弄清楚如何将 facebook 会话正确存储在 PHP $_SESSION 数组中,并能够将其拉回并使用它来调用 facebook?
我正在使用最新的 facebook JS sdk 和最新的 facebook PHP sdk。
代码:
<?php
session_start();
require_once ('facebookphpsdkv4/src/Facebook/GraphObject.php');
require_once ('facebookphpsdkv4/src/Facebook/GraphUser.php');
require_once ('facebookphpsdkv4/src/Facebook/GraphSessionInfo.php');
require_once ('facebookphpsdkv4/src/Facebook/Entities/AccessToken.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSession.php');
require_once ('facebookphpsdkv4/src/Facebook/Entities/SignedRequest.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSignedRequestFromInputHelper.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookJavaScriptLoginHelper.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookHttpable.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookCurl.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookCurlHttpClient.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookResponse.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookRequest.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSDKException.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookRequestException.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookAuthorizationException.php');
useFacebookGraphObject;
useFacebookGraphUser;
useFacebookGraphSessionInfo;
useFacebookEntitiesAccessToken;
useFacebookFacebookSession;
useFacebookEntitiesSignedRequest;
useFacebookFacebookSignedRequestFromInputHelper;
useFacebookFacebookJavaScriptLoginHelper;
useFacebookHttpClientsFacebookHttpable;
useFacebookHttpClientsFacebookCurl;
useFacebookHttpClientsFacebookCurlHttpClient;
useFacebookFacebookResponse;
useFacebookFacebookRequest;
useFacebookFacebookSDKException;
useFacebookFacebookRequestException;
useFacebookFacebookAuthorizationException;
FacebookSession::setDefaultApplication('AppID', 'AppSecret');
if (isset($_SESSION['session']))
{
echo 'session set';
$session = $_SESSION['session'];
}
else
{
$helper = new FacebookJavaScriptLoginHelper();
try
{
$session = $helper->getSession();
$_SESSION['session'] = $session;
}
catch(FacebookRequestException $e)
{
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
catch(Exception $e)
{
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
}
if ($session)
{
try
{
$user_profile = (new FacebookRequest($session, 'GET', '/me'))->execute()->getGraphObject(GraphUser::className());
echo "Name: " . $user_profile->getName();
}
catch(FacebookRequestException $e)
{
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
}
?>
【问题讨论】:
-
您需要确保在 session_start 之前已经包含了适当的类
-
@MarkBaker 你确定这样行吗?这看起来很奇怪,但我猜如果 PHP 不提前知道会话的结构,它就不知道如何解析或反序列化它?我会试试的。
-
这正是问题所在......并且使用自动加载器不适用于从会话中反序列化对象
-
这似乎有效@MarkBaker。感谢您对答案的精确定位和快速响应。如果你愿意,请回答,我会接受它是正确的,因为你是第一个建议正确修复的人。再次感谢。
标签: php facebook session facebook-graph-api facebook-php-sdk