![](/img/trans.png)
[英]Facebook redirecting to canvas url instead of canvas page after app authorization
[英]Facebook application doesn't work in IE(Redirecting to the host Canvas Callback URL)
我有一個名為 fbmain.php 的文件,它執行所有 facebook 身份驗證部分。 我在 index.php 文件中有一個按鈕,它將數據傳遞給 a.php 文件
這只是一個例子
//fbmain.php : do all facebook authentication parts
//index.php
<?php
include_once "fbmain.php";
?>
<form enctype="multipart/form-data" action="http://myserver/a/a.php" method="POST">
//Some codes
<input type="submit" value="Upload"/>
</form>
在 a.php 文件中,我必須再次包含 fbmain.php,因為我在這里做了一些 api 調用。
//a.php
<?php
include_once "fbmain.php";
//some codes
try{
$me = $facebook->api('/me?access_token='. $token);
print_r($me);
} catch(FacebookApiException $e){
echo "Error:" .$e;
}
?>
此應用程序在 firefox 瀏覽器中運行良好,但在 IE 中不起作用(當用戶單擊“上傳按鈕時,它將用戶重定向到主機 Canvas 回調 URL”)。
我嘗試在每個文件的頂部放置以下代碼(fbmain.php,index.php,a.php)。 但是還是不行?
首先我試過這個
header('P3P: CP=HONK');
ob_start();
然后我嘗試了這個
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
ob_start();
但是在 IE 中沒有任何作用。
誰能幫幫我嗎?
//fbmain.php文件
<?php
//header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
header('P3P: CP="CAO PSA OUR"');
ob_start();
//facebook application
//set facebook application id, secret key and api key here
$fbconfig['appid' ] = "MY_APP_ID";
$fbconfig['api' ] = "MY_API_KEY";
$fbconfig['secret'] = "MY_APP_SECRET";
//set application urls here
$fbconfig['baseUrl'] = "http://MYSERVER/uploader/index.php"; //http://thinkdiff.net/demo/newfbconnect1/iframe;
$fbconfig['appBaseUrl'] = "http://apps.facebook.com/approne"; //http://apps.facebook.com/thinkdiffdemo;
$uid = null; //facebook user id
try{
include_once "facebook.php";
}catch(Exception $o){
echo '<pre>';
print_r($o);
echo '</pre>';
}
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => $fbconfig['appid'],
'secret' => $fbconfig['secret'],
'cookie' => true,
));
//Facebook Authentication part
$session = $facebook->getSession();
$loginUrl = $facebook->getLoginUrl(
array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'email,publish_stream,status_update,user_photos'
)
);
if (!$session) {
echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
exit;
}
if ($session) {
try {
$uid = $facebook->getUser();
//Has a loading problem
} catch (FacebookApiException $e) {
echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
exit;
}
}
$signed_request = $_REQUEST['signed_request'];
$secret = $fbconfig['secret'];
$data = parse_signed_request($signed_request, $secret);
$fan_page_id = $data['page']['id'];
$admin_check = $data['page']['admin'];
//Get fan page id
function parse_signed_request($signed_request, $secret) {
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
// decode the data
$sig = base64_url_decode($encoded_sig);
$data = json_decode(base64_url_decode($payload), true);
if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
error_log('Unknown algorithm. Expected HMAC-SHA256');
return null;
}
// check sig
$expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
if ($sig !== $expected_sig) {
error_log('Bad Signed JSON signature!');
return null;
}
return $data;
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '-_', '+/'));
}
?>
在用戶 session 沒有持久化服務器端之前,我遇到了與 IE 類似的問題。 為了解決這個問題,我在 forms 中添加了一個隱藏字段,該字段提供給包含signed_request
的 IE。
<input type='hidden' name='signed_request' value='VALID_SIGNED_REQUEST' />
但是此解決方案應使用code
參數或通過傳遞授權令牌然后使用它來恢復用戶 session 服務器端。 您也可以嘗試維護自己的 session cookie。
我看到您使用的是 PHP SDK 的 pre v3。 所以你應該嘗試添加隱藏字段:
<input type='hidden' name='session' value='<?php echo json_encode($session); ?>' />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.