我正在尝试制作一个非常简单的Facebook页面标签应用程序。我只需要使用$pageTabHelper->isAdmin()
来判断用户是否是页面管理员。
当用户第一次打开页面选项卡时返回正确的值,但每当他跟随应用程序中的超链接时,$accessToken
将更改为null,用户不再是管理员,即使他返回原来的“index.php”页面。
这是一个显示问题的测试页。
<?php
require_once __DIR__ . '/../Application.php';
$app = new Application();
$facebook = $app->getFacebook();
$loginHelper = $facebook->getRedirectLoginHelper();
$pageTabHelper = $facebook->getPageTabHelper();
// Grab the signed request entity
$request = $pageTabHelper->getSignedRequest();
// Get the user ID if signed request exists
$user = $request ? $request->getUserId() : null;
if ( $user ) {
try {
// Get the access token
$accessToken = $pageTabHelper->getAccessToken();
} catch( Facebook\Exceptions\FacebookSDKException $e ) {
// There was an error communicating with Graph
echo $e->getMessage();
exit;
}
}
echo "<h1>isadmin</h1>";
echo var_dump($pageTabHelper->isAdmin());
echo '<a href="/index.php?test=test"> test link </a>';
?>
使用此登录代码将应用程序添加到用户允许的应用程序中。
if (!isset($accessToken)) {
function isSSL()
{
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
}
$callback = (isSSL() ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . 'facebook_login.php';
$loginUrl = $loginHelper->getLoginUrl($callback, ['public_profile']);
echo '<a target="_blank" class="facebook_login" href="' . $loginUrl . '">Log in</a>';
}
我觉得我误解了Facebook身份验证的工作方式。为什么用户不能在不破坏其身份验证的情况下遵循“测试链接”超链接?
我必须将整个应用程序设为一个页面并使用ajax而不是超链接和回发吗?
答案 0 :(得分:1)
只有在初始加载到iframe时才会将signed_request
参数发布到您的应用程序 - 因此您应该执行仅尝试从中获取信息的代码(在您检查参数存在之后再执行),以及不在每一页上。
(您可能只是在后续的应用内页面null
中获得$request
,然后$user
也会被您的代码设置为null
。 )