【问题标题】:Exchanging Facebook Auth Code for Access Token using the PHP SDK使用 PHP SDK 将 Facebook Auth 代码交换为 Access Token
【发布时间】:2013-08-10 08:58:07
【问题描述】:

here 所述,我正在尝试使用 Facebook PHP SDK 而非 Javascript 构建服务器到服务器的身份验证流程。到目前为止,我已经成功创建了一个 LoginUrl,它允许用户使用 Facebook 登录,然后重定向回我的应用程序并检查状态参数以进行 CSFR 保护。

我的问题是,我似乎无法让应该将我的身份验证代码换成访问令牌的 API 调用正常工作。我掠夺了谷歌能够找到的所有其他人遇到的类似问题,以寻求可能的解决方案。 然而最终结果总是一样的:没有访问令牌,没有我可以评估的错误消息。

研究该主题产生了以下建议,我对此进行了测试:

  • App Settings 中指定的 URL 必须是 $appUrl 的父文件夹。
  • 使用 curl 代替 SDK 函数 api() 发出请求

我已经连续 2 天了,真的需要一些帮助。

<?php

require '../inc/php-sdk/src/facebook.php';
// Setting some config vars

$appId = 'MY_APP_ID';
$secret = 'MY_APP_SECRET';
$appUrl = 'https://MY_DOMAIN/appFolder';
$fbconfig = array('appId'=>$appId, 'secret'=>$secret);

$facebook =  new Facebook($fbconfig);

// Log User in with Facebook and come back with Auth Code if not yet done
if(!(isset($_SESSION['login']))){
    $_SESSION['login']=1;
    header('Location: '.$facebook->getLoginUrl());
}
// process Callback from Facebook User Login
if($_SESSION['login']===1) {
    /* CSFR Protection: getLoginUrl() generates a state string and stores it 
in "$_SESSION['fb_'.$fbconfig['appId'].'_state']". This checks if it matches the state 
obtained via $_GET['state']*/
    if (isset($_SESSION['fb_'.$fbconfig['appId'].'_state'])&&isset($_GET['state'])){
        // Good Case
        if ($_SESSION['fb_'.$fbconfig['appId'].'_state']===$_GET['state']) {
            $_SESSION['login']=2;
        }
        else {
            unset($_SESSION['login']);
            echo 'You may be a victim of CSFR Attacks. Try <a 
href="'.$facebook->getLoginUrl().'">logging in</a> again.';
        }
    }
}

// State check O.K., swap Code for Token now
if($_SESSION['login']===2) {
    $path = '/oauth/access_token';
    $api_params = array (
            'client_id'=>$appId,
            'redirect_uri'=>$appUrl,
            'client_secret'=>$secret,
            'code'=>$_GET['code']
    );
    $access_token = $facebook->api($path, 'GET', $api_params);
    var_dump($access_token);
}

【问题讨论】:

    标签: facebook facebook-graph-api oauth-2.0 facebook-php-sdk facebook-access-token


    【解决方案1】:

    我发现最简单的方法是扩展 Facebook 类并公开受保护的 getAccessTokenFromCode() 方法:

    <?php
    
    class MyFacebook extends Facebook {
    
        /** If you simply want to get the token, use this method */
        public function getAccessTokenFromCode($code, $redirectUri = null)
        {
            return parent::getAccessTokenFromCode($code, $redirectUri);
        }
    
        /** If you would like to get and set (and extend), use this method instead */
        public function setAccessTokenFromCode($code)
        {
            $token = parent::getAccessTokenFromCode($code);
            if (empty($token)) {
                return false;
            }
            $this->setAccessToken($token);
            if (!$this->setExtendedAccessToken()) {
                return false;
            }
            return $this->getAccessToken();
        }
    
    }
    

    我还包含了我用来设置访问令牌的便捷方法的变体,因为我自己的代码中实际上并不需要公共“get”方法。

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 2013-09-13
      • 1970-01-01
      • 2023-03-11
      • 2014-05-21
      • 2019-06-26
      • 2018-08-25
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多