我对OAuth / Facebook流程感到困惑

时间:2010-08-24 12:20:44

标签: php facebook oauth

我已按照http://developers.facebook.com/docs/api#authorization上的说明使用标准PHP库。一切正常,直到它重定向到我的网站。我不确定我在这里做什么!当重定向发生时,我可以看到关键的facebook谈论我用来在URL中请求OAuth令牌。

但是我的意思是什么呢?我是否编写了一个简单的脚本来获取新的“代码”值并将请求发送到Facebook页面,其中包含详细信息?在php库中是否没有调用我的整个过程?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:5)

以下是代码在我的应用程序中的外观(本例简化)

$code = $_REQUEST['code'];
if ( $code )
{
  $response = $facebook->api( '/oauth/access_token', 'GET', array(
      'client_id'     => $facebook->getAppId()
    , 'client_secret' => $facebook->getApiSecret()
    , 'redirect_uri'  => 'http://example.com/your/redirect/uri'
    , 'code'          => $code
  ) );
  parse_str( $response, $vars );
  $oauthToken = $vars['access_token'];

  // Persist this token in the session, DB, or wherever you want

} else {
  switch ( $_REQUEST['error_reason'] )
  {
    case 'user_denied':
      // some sort of message here
      break;
  }
}

如果像我一样,你创建了Facebook的子类,只需将上面的一些内容放入一个新方法

/**
 * Exchange an Access Code for an OAuth Token
 *  
 * @param string $accessCode
 * @param string $redirectUrl
 * 
 * @return string OAuth Token
 */
public function getOauthTokenFromAccessCode( $accessCode, $redirectUrl )
{
  $response = $this->api( '/oauth/access_token', 'GET', array(
      'client_id'     => $this->getAppId()
    , 'client_secret' => $this->getApiSecret()
    , 'redirect_uri'  => $redirectUrl
    , 'code'          => $accessCode
  ) );
  parse_str( $response, $vars );
  return $vars['access_token'];
}

这简化了客户端代码

$code = $_REQUEST['code'];
if ( $code )
{
  $oauthToken = $facebook->getOauthTokenFromAccessCode(
      $code
    , 'http://example.com/your/redirect/uri'
  );

  // Persist this token in the session, DB, or wherever you want

} else {
  switch ( $_REQUEST['error_reason'] )
  {
    case 'user_denied':
      // some sort of message here
      break;
  }
}