【问题标题】:Facebook PHP-SDK seems to lose userID after page refresh页面刷新后 Facebook PHP-SDK 似乎丢失了用户 ID
【发布时间】:2013-03-15 08:01:36
【问题描述】:

我的登录似乎工作正常,我可以登录,接受应用程序(第一次)然后显示用户信息,如姓名/图片/等。

但是,当我刷新页面时,用户 ID 回到 0,我必须再次登录 - 我不确定问题是什么,我必须在每次页面加载时重新启动它还是什么?我不知道,我会发布一些代码 - 这可能很难,因为它们是一堆单独的文件:

fb_login.php -

<?php
    require_once("fb_login/facebook.php");
    $facebook = new Facebook(array(
      'appId' => 'APP_ID',
      'secret'=> 'APP_SECRET',
      'cookie'=> 'true'
    ));
    $userId = $facebook->getUser();

    if ($userId) {
        $userId = $facebook->getUser();
         echo("userID is: $userId");
}
    else{
        header("Location: {$loginURL}");
         echo("userId is: $userId");
    }


?>

navbar.php -

<?php
              if($userId){
                 try {
                  $user_profile = $facebook->api('/me','GET');
                  echo '<li><a href="#">Welcome: ' . $user_profile['name'] . '</a></li>';
                  echo '<li><img src="https://graph.facebook.com/' . $user_profile['username'] . '/picture"><li>';
                  echo '<li class="divider-vertical"></li>';
                 } catch (FacebookApiException $e) {
                    $login_url = $facebook->getLoginUrl(); 
                    echo '<li>Please <a href="' . $login_url . '">login.</a></li>';
                    error_log($e->getType());
                    error_log($e->getMessage());
                 }
              }
              else{
                  echo '<li><a href="newUser.php">Sign Up</a></li>
                      <li class="divider-vertical"></li>';
              }
            ?>
<?php
                  if ($userId) { 
                    // echo("userID is: $userId");
                    // $params = array( 'next' => 'http://localhost/bcbooks-repo/index_new.php' );

                    $logoutUrl = $facebook->getLogoutUrl(); // $params is optional. 
                    echo '<li><a href="' . $logoutUrl . '">Log Out</a></li>';
                    $facebook->destroySession();
                  }
                  else{?>
<?php
                $userId = $facebook->getUser();
                $accessToken = $facebook->getAccessToken();
                $params = array(
                    'scope' => 'read_stream, friends_likes',
                    'redirect_uri' => 'http://localhost/bcbooks-repo/index_new.php'
                );

                $loginUrl = $facebook->getLoginUrl($params);
                echo '<a href="' . $loginUrl . '" class="btn btn-primary btn-block" type="button" id="sign-in-facebook">Sign In with Facebook</a>';
                                        ?>
<?php } ?>

index.php -

<?php
  require_once 'inc/FB_login.php';
require_once 'inc/navbar.php'; ?>

登录 -

页面刷新后

控制台结果

【问题讨论】:

    标签: php facebook facebook-php-sdk


    【解决方案1】:

    虽然您正在使用 cookie 选项 TRUE 加载 facebook PHP SDK,但服务器端无法猜测用户是否仍在您的网站上登录,或者他是否已更改为其他帐户等。

    如果您想在所有页面中保留 usar,您必须将 javascript SDK 与 PHP SDK 结合使用。为此,您只需在您拥有的每个页面中加载 javascript SDK,将其放在需要与 facebook 交互的每个页面上,紧挨着&lt;body&gt; 标签:

    <body>
        <div id="fb-root"></div>
            <script>
              window.fbAsyncInit = function() {
                FB.init({
                  appId      : 'YOUR_APP_ID', // App ID
                  channelUrl : 'URL TO YOUR CHANNEL FILE', // Channel File Optional
                  status     : true, // check login status
                  cookie     : true, // enable cookies to allow the server to access the session
                  xfbml      : true  // parse XFBML
                });
    
                // Additional initialization code here
    
                };
    
    
              // Load the SDK Asynchronously
              (function(d){
                 var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
                 if (d.getElementById(id)) {return;}
                 js = d.createElement('script'); js.id = id; js.async = true;
                 js.src = "//connect.facebook.net/en_US/all.js";
                 ref.parentNode.insertBefore(js, ref);
               }(document));
        </script>
    

    【讨论】:

    • 谢谢你 - 我添加了那个,但仍然没有骰子。每当我刷新页面时,UserId 就会立即回到 0。我不需要重新授权应用程序,我只需要点击登录,但它似乎不记得了..
    • Cookies 正在设置,所以这很好 - 也许我需要编写一些 JS 来在每个页面加载时检查该 cookie?
    • 不,javascript SDK 和 PHP SDK 可以处理,你的项目在线吗?您是否尝试过使用 firebug 或 chrome 的控制台来检查 javascript 是否正确加载?
    • 它正在运行 localhost ,但我在线。 cookie 是用 Java 脚本设置的,并且有值,但看起来没有使用这些值?
    • 我添加了一些控制台截图以及刷新前后发生了什么
    【解决方案2】:

    在 Fabio 建议的基础上尝试使用此代码(显然将 YOUR_APP_ID 替换为您的实际应用 ID)

         <div id="fb-root"></div>
      <script>     
    
      window.fbAsyncInit = function() {
        FB.init({
          appId: 'YOUR_APP_ID', 
          status: true,
             cookie: true,
             xfbml: true,
           channelUrl:'/channel.html',
          frictionlessRequests: true,
          useCachedDialogs: true,
          oauth: true
        });
        FB.Event.subscribe('auth.login', function(response) {
          window.location.reload();
        });
        FB.Event.subscribe('auth.logout', function(response) {
          window.location.reload();
        });
      };
    (function(d){
       var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
       js = d.createElement('script'); js.id = id; js.async = true;
          js.src = "//connect.facebook.net/en_US/all.js";
        ref.parentNode.insertBefore(js, ref);
         }(document));
          </script>
    

    【讨论】:

    • 不幸的是似乎没有这样做 - 刷新后 UserId 仍然恢复为 0
    • 事实上,它似乎陷入了某种循环,并且每秒刷新/重新加载页面几次
    • 尝试删除对 header($loginUrl) 的调用。我认为如果身份验证尚未完成,它可能会继续将它们发送到您的代码中的登录 url
    • 只是这样做了,它仍然会自动刷新自己.. 显然它与窗口重新加载有关.. 几乎就像它重新加载一样,它在某个地方重新初始化自身,调用了 javascript get 并找到退出它需要登录,然后重新开始该过程
    • 我已经阅读了一些关于 facebook 与 localhost 存在问题的信息,所以我今天早上将把它放到网上,这样我就可以排除这个问题了..
    【解决方案3】:

    尝试在 cookie 中声明 userID,就像这样:

    $user = $facebook->getUser();
    $expire=time()+60*60*24*30;
    setcookie("user", $user, $expire);
    

    对我来说,它就像一种魅力;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-04
      • 2016-01-26
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2020-11-19
      • 2014-07-20
      相关资源
      最近更新 更多