Facebook php sdk v4 oauth错误重定向uri

时间:2014-07-20 11:42:16

标签: php facebook facebook-php-sdk

我在使用新的php-sdk时遇到了一些奇怪的问题,我似乎无法解决这个问题。

我有一个phalconphp应用程序,如果他们当前没有登录,我会向用户显示注册视图,无论我提供此视图的网址如何(不重定向网址)

当我设置我的FacebookRedirectLoginHelper时,我传入了http主机和请求uri,以便我可以将用户重定向回他们最初尝试访问的同一页面,例如

  Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);

不幸的是,这不起作用。我总是得到一个SDK异常,告诉我redirect_uri不是传入的。即使我在主页上就是这种情况,例如

  var_dump($_SERVER['REQUEST_URI']);
  returns "/"

但是,如果我明确地将尾部斜杠放入而不是request_uri,那么它可以正常工作。 e.g

 Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].'/');

我甚至比较了2个生成的网址(再次只是在索引页面上,所以路径只是“/”)并且它们完全相同。唯一的问题似乎是试图动态生成这个。我无法为我的生活解决这里发生的事情。它似乎不是任何一种双重编码,我只是有点难过为什么这不起作用。

起初我认为它可能与PhalconPHP和路由有关,但这似乎并非如此,因为即使是一个简单的例子也会失败。

下面是一个简单的php文件示例。您显然需要包含sdk并设置应用程序

 <?php
   ob_start();
   session_start();
   $appId = 'xxxxxxxxxxxxxxxxxxxxxxxx';
   $secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

   //require all the facebook stuff
   Facebook\FacebookSession::setDefaultApplication($appId,$secret);
   $helper = new Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'] .'/'); //will work
   //$helper = new Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI']); //won't work


// see if a existing session exists
if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) {
// create new session from saved access_token
$session = new FacebookSession( $_SESSION['fb_token'] );

 // validate the access_token to make sure it's still valid
 try {
   if ( !$session->validate() ) {
     $session = null;
   }   
  } catch ( Exception $e ) {
  // catch any exceptions
  $session = null;
 }
 }  

if ( !isset( $session ) || $session === null ) {
// no session exists

try {
$session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
// When Facebook returns an error
// handle this better in production code
print_r( $ex );
} catch( Exception $ex ) {
// When validation fails or other local issues
// handle this better in production code
print_r( $ex );
}

}

// see if we have a session
 if ( isset( $session ) ) {

 // save the session
 $_SESSION['fb_token'] = $session->getToken();
  // create a session using saved token or the new one we generated at login
   $session = new FacebookSession( $session->getToken() );

  // graph api request for user data
   $request = new FacebookRequest( $session, 'GET', '/me' );
 $response = $request->execute();
  // get response
   $graphObject = $response->getGraphObject()->asArray();

  // print profile data
   echo '<pre>' . print_r( $graphObject, 1 ) . '</pre>';

  // print logout url using session and redirect_uri (logout.php page should destroy the session)
   echo '<a href="' . $helper->getLogoutUrl( $session, 'http://yourwebsite.com/app/logout.php' ) . '">Logout</a>';

} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl( array( 'email', 'user_friends' ) ) . '">Login</a>';
   }

实际例外是:

Facebook\FacebookAuthorizationException Object ( [statusCode:Facebook\FacebookRequestException:private] => 400 [rawResponse:Facebook\FacebookRequestException:private] => {"error":{"message":"Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request","type":"OAuthException","code":100}} 

 [responseData:Facebook\FacebookRequestException:private] => Array ( [error] => Array ( [message] => Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request [type] => OAuthException [code] => 100 ) ) [message:protected] => Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。这是我的愚蠢。当使用$ _SERVER ['REQUEST_URI']生成登录URL时,它显然会在第二次运行时返回为“/”,再次实例化它,但这次返回的查询字符串在其中,因此重定向的uri设置在辅助类不再与基础uri相同。基本上我需要没有查询字符串的请求uri

所以现在我只使用

  $_SERVER['HTTP_HOST']. strtok($_SERVER['REQUEST_URI'], '?')