【问题标题】:Facebook token in relation with Session与 Session 相关的 Facebook 令牌
【发布时间】:2014-01-08 08:26:17
【问题描述】:

我的脸书有这个功能

public function link2(){
        global $config;
        $facebook = new Facebook(array(
              'appId'  => $config['facebook_appId'],
              'secret' => $config['facebook_secret'],
              'cookie' => true
        ));
        return $facebook;
    }

然后我这样做是为了得到令牌

if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){
            $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token'];
        }else{
            $accesstoken = $facebook->getAccessToken();
        }

并将其存储在 DB 中,但在我注销并再次登录并再次调用 ALBUMS 后出现错误

A user access token is required to request this resource

我在我的 logout.php 文件中做session_destroy,我想知道会话与此有何关系,如果我将我的 logout.php 文件更改为仅取消设置 userId 变量,那么调用对我有用。 我错过了什么吗?

【问题讨论】:

  • 你能确认令牌保存到数据库吗?以及如何将访问令牌设置回 Facebook 对象?多一点你的代码可以帮助你得到答案。
  • @m_poorUser 是的,它已保存到数据库中,"你如何将访问令牌设置回 Facebook 对象?我没有这样做,不确定这是什么
  • 我的意思是你如何使用你在注销并再次登录后保存数据库的访问令牌?
  • @m_poorUser 查询数据库并获取令牌然后执行此操作 $facebook = new Facebook(array( 'appId' => $config['facebook_appId'], 'secret' => $config[' facebook_secret'], access_token=>$tokenFROMDB ));
  • 我认为它与会话无关,因为当您第一次登录并获取访问令牌时,它存储在会话中,您正在使用它。如果您销毁会话,下次用户登录时令牌会消失并从数据库中提取,对吗?因此,如果您在销毁会话时遇到问题,那么它必须与其他东西相关。 Session 完全按照您的场景执行它应该做的事情。

标签: php mysql facebook session oauth-2.0


【解决方案1】:
if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){
   $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token'];
}else{
   $accesstoken = $facebook->getAccessToken();
}

如果这是您必须分配$accesstoken 的唯一代码,那么注销后$accesstoken 将是未定义的。 session_destory() 删除存储在 $_SESSION 中的所有密钥。所以isset() 将返回false。接下来,$facebook->getAccessToken() 只检查令牌是否作为查询字符串参数存在;因为令牌没有被发送(只有在某人从 Facebook 重定向后才会发送),因此$accesstoken 是未定义的。

快速解决方法是将会话密钥设置为以前存在的状态。在您的身份验证代码之后,直接使用数据库中的用户数据设置会话密钥。如:

$_SESSION['fb_'.$config['facebook_appId'].'_access_token'] = $user_from_database['his_stored_access_token'];

【讨论】:

    【解决方案2】:
    //Check and retrieve access token if exists for current user
    $atfromdb = mysql_query("......"); 
    
    if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){
         $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token'];
    }else if( strlen($atfromdb) > 0 ){
         $accesstoken = $atfromdb;
    }else{
         $accesstoken = $facebook->getAccessToken();
    }
    

    【讨论】:

      【解决方案3】:

      只需按照以下步骤操作即可。您可能需要获取离线访问令牌。

      1.您将拥有 App Name、App URL、App ID 和 App Secret 获取访问码,前往:

      https://www.facebook.com/dialog/oauth?client_id=Your_App_ID&redirect_uri=Your_App_URL&scope=read_stream,publish_stream,offline_access

      点击后;您的浏览器将被重定向到带有附加 URL 属性的 Your_App_URL,它看起来像:

      Your_App_URL?code=long_facebook_code

      2.获取离线访问令牌,转到:

      https://graph.facebook.com/oauth/access_token?client_id=Your_App_ID&redirect_uri=Your_App_URL&client_secret=Your_App_Secret&code=long_facebook_code

      页面会显示类似

      access_token=123456789|99bdea74e40ecc75530b7c45-132456798|dTntC8lVyR84eBxK1TS9ws2s_s0

      注意:确保令牌末尾没有单词“expire=”(粗体文本)复制您的离线令牌(仅粗体文本)并使用它,它是永久令牌,如果您更改,则永远不会更改事件您的应用程序名称。

      【讨论】:

        【解决方案4】:

        为什么要将用户访问令牌存储在会话中?会话数据的全部意义在于临时存储。

        您可以在登录期间将令牌保存到数据库中,并在每次调用$facebook = new Facebook( ...时从那里读取它

        如果你只将它存储在一个地方会容易得多。

        第二点是,您不能期望用户使用注销按钮。如果用户只是关闭浏览器并杀死他或她的 cookie,会话将不会被破坏,但没有人可以再访问它。所以注销唯一应该做的就是销毁会话。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-23
          • 2016-11-06
          • 2012-02-16
          相关资源
          最近更新 更多