美元会话[';fb#u id';]在facebook连接后重定向到子域uri时丢失

美元会话[';fb#u id';]在facebook连接后重定向到子域uri时丢失,facebook,session,subdomain,facebook-php-sdk,Facebook,Session,Subdomain,Facebook Php Sdk,我有几个子域网站,我希望在每个子域上都有facebook连接 我已经为主域名创建了我的fb应用程序,并且它可以正常工作 在每个子域中,我使用此链接进行连接(由ajax调用编写): 我的fbConnect.php <?php header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // Hack IE for POST params... header("Ca

我有几个子域网站,我希望在每个子域上都有facebook连接

我已经为主域名创建了我的fb应用程序,并且它可以正常工作

在每个子域中,我使用此链接进行连接(由ajax调用编写):


我的fbConnect.php

<?php
    header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // Hack IE for POST params...
    header("Cache-Control: no-cache");
    header("Pragma: no-cache");

    session_set_cookie_params(0, '/', '.mydomain.com', false); // If session is lost with subdomains...
    session_start();
    require('/home/....../facebook.php');

    $facebook = new Facebook(array(
    'appId' => 'myid',// changed for the example
    'secret' => 'mysecret', // same
    'cookie' => true,
    ));

    $user = null;

    $loginUrl=$facebook->getLoginUrl(
            array(
                  'canvas'    => 0,
                'scope'         => 'email,publish_stream,user_location'
            )
    );
    $logoutUrl  = $facebook->getLogoutUrl();

    $user=$facebook->getUser();

    if(!$user) echo "<script>top.location.href='".$login_url."'</script>";

    if ($user) {
        echo "Ok";
        $user_profile = $facebook->api('/me');  
        $userInfo = $facebook->api("/$user");
        $_SESSION['fb_id']=$userInfo['id'];
       // Some stuff...
       echo "<script type='text/javascript'>top.location.href = '".$_GET['ref']."';</script>";
    }
?>
ini_set("session.cookie_domain", ".myDomain.com");
session_start();

$app_id = "myappid";
$app_secret = "myappsecret";
$my_url = "http://www.mydomain.com/fbConnect.php";


$code = $_REQUEST["code"];

if(empty($code)) {
 $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
 $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state']. "&scope=email,publish_stream,status_update,offline_access";

 echo("<script> top.location.href='" . $dialog_url . "'</script>");
}

if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) 
{
    $token_url = "https://graph.facebook.com/oauth/access_token?"
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
     . "&client_secret=" . $app_secret . "&code=" . $code;

    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);


    $_SESSION['access_token'] = $params['access_token'];

    $graph_url = "https://graph.facebook.com/me?access_token=" 
     . $params['access_token'];

    $user = json_decode(file_get_contents($graph_url));
    //var_dump($user);


    $_SESSION['id_fb']=$user->id;
   // Some stuff
    // Then redirect to the subdomain page of connection
   echo "<script type=\"text/javascript\">top.location.href =\"".$_SESSION['connexion_ref']."\";</script>";
}

最后,出现了一些错误:

1。会话

它们在子域中没有遵循,所以诀窍是更改php.ini或添加
ini_集(“session.cookie_domain”,“.myDomain.com”)(谢谢@Tommy Crush)

2。重定向\u uri

在我的例子中,似乎不可能在
redirect\u uri中发送变量=http://www.myDomain.com?var1=123&var2=456...

3。API使用

我必须阅读GRAPH API的新初学者面板,我对更改的数量感到惊讶

我最终使用了以下方法:

在每个子域中

// Simple link to the connection page
echo "<a href=\"http://wwww.myDomain.com/fbConnect.php\">Connect with FB</a>";
// Record the current page whitch called this ajax
$_SESSION['connexion_ref']=$_SERVER['HTTP_REFERER'];
//连接页面的简单链接
回声“;
//记录当前页面,该页面称为ajax
$\u会话['connexion\u ref']=$\u服务器['HTTP\u REFERER'];
我的新fbConnect.php

<?php
    header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // Hack IE for POST params...
    header("Cache-Control: no-cache");
    header("Pragma: no-cache");

    session_set_cookie_params(0, '/', '.mydomain.com', false); // If session is lost with subdomains...
    session_start();
    require('/home/....../facebook.php');

    $facebook = new Facebook(array(
    'appId' => 'myid',// changed for the example
    'secret' => 'mysecret', // same
    'cookie' => true,
    ));

    $user = null;

    $loginUrl=$facebook->getLoginUrl(
            array(
                  'canvas'    => 0,
                'scope'         => 'email,publish_stream,user_location'
            )
    );
    $logoutUrl  = $facebook->getLogoutUrl();

    $user=$facebook->getUser();

    if(!$user) echo "<script>top.location.href='".$login_url."'</script>";

    if ($user) {
        echo "Ok";
        $user_profile = $facebook->api('/me');  
        $userInfo = $facebook->api("/$user");
        $_SESSION['fb_id']=$userInfo['id'];
       // Some stuff...
       echo "<script type='text/javascript'>top.location.href = '".$_GET['ref']."';</script>";
    }
?>
ini_set("session.cookie_domain", ".myDomain.com");
session_start();

$app_id = "myappid";
$app_secret = "myappsecret";
$my_url = "http://www.mydomain.com/fbConnect.php";


$code = $_REQUEST["code"];

if(empty($code)) {
 $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
 $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state']. "&scope=email,publish_stream,status_update,offline_access";

 echo("<script> top.location.href='" . $dialog_url . "'</script>");
}

if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) 
{
    $token_url = "https://graph.facebook.com/oauth/access_token?"
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
     . "&client_secret=" . $app_secret . "&code=" . $code;

    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);


    $_SESSION['access_token'] = $params['access_token'];

    $graph_url = "https://graph.facebook.com/me?access_token=" 
     . $params['access_token'];

    $user = json_decode(file_get_contents($graph_url));
    //var_dump($user);


    $_SESSION['id_fb']=$user->id;
   // Some stuff
    // Then redirect to the subdomain page of connection
   echo "<script type=\"text/javascript\">top.location.href =\"".$_SESSION['connexion_ref']."\";</script>";
}
ini_集(“session.cookie_domain”,“.myDomain.com”);
会话_start();
$app_id=“myappid”;
$app_secret=“myappsecret”;
$my_url=”http://www.mydomain.com/fbConnect.php";
$code=$_请求[“code”];
if(空($code)){
$_SESSION['state']=md5(uniqid(rand(),TRUE));//CSRF保护
$dialog_url=”https://www.facebook.com/dialog/oauth?client_id=" 
.$app\u id.&redirect\u uri=“.urlencode($my\u url)。”&state=”
.$\会话['state']。“&scope=电子邮件、发布\流、状态\更新、脱机\访问”;
echo(“top.location.href=”。$dialog\u url。””;
}
如果($_会话['state']&&($_会话['state']===$_请求['state']))
{
$token_url=”https://graph.facebook.com/oauth/access_token?"
“client_id=“.app_id.”和redirect_uri=“.urlencode($my_url)
.“&client_secret=”.$app_secret.&code=”.$code;
$response=file\u get\u contents($token\u url);
$params=null;
parse_str($response,$params);
$\u会话['access\u token']=$params['access\u token'];
$graph_url=”https://graph.facebook.com/me?access_token=" 
.$params['access_token'];
$user=json_decode(文件获取内容($graph_url));
//var_dump($user);
$\会话['id\u fb']=$user->id;
//一些东西
//然后重定向到connection的子域页面
echo“top.location.href=\”.$\u会话['connexion\u ref']。\”;
}

现在它就像一个魔咒一样工作。

您是否尝试过在session\u开始时使用
ini\u集(“session.cookie\u domain”,“.yourDomain.com”)之前设置php.ini谢谢,这对会话来说是一个很好的解决方案,但是ref-var还有一个问题,重定向uri不支持这个问题…如果您先对整个url进行编码,您应该能够在
重定向uri
中传递vars。谢谢,但是会话var在我的情况下更好。