代码之家  ›  专栏  ›  技术社区  ›  Steve

我对OAuth/Facebook进程感到困惑

  •  2
  • Steve  · 技术社区  · 14 年前

    我已经按照上面的说明做了 http://developers.facebook.com/docs/api#authorization

    但是我该怎么办呢?我是否编写了一个简单的脚本,接受新的“code”值,并将一个包含在详细信息中的请求放在facebook页面上?在php库中没有调用来为我完成整个过程吗?

    谢谢你的帮助。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Peter Bailey    14 年前

    下面是代码在我的应用程序中的外观(对于本例进行了简化)

    $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;
      }
    }