【问题标题】:Facebook php sdk v4 oauth error for redirect uri重定向uri的Facebook php sdk v4 oauth错误
【发布时间】:2014-07-20 20:31:10
【问题描述】:

新的 php-sdk 出现了一些奇怪的问题,我似乎无法解决。

我有一个 phalconphp 应用程序,如果用户当前未登录,我会在其中向用户显示注册视图,无论我显示此视图的 url 是什么(不重定向 url)

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

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

不幸的是,这不起作用。我总是收到一个 SDK 异常,告诉我 redirect_uri 不是传入的。即使我在主页上也是如此,例如

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

但是,如果我明确地放入斜杠而不是 request_uri,那么它可以正常工作。例如

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

我什至比较了 2 个生成的 url(同样只是在索引页面上,所以路径只是“/”),它们完全相同。唯一的问题似乎是试图动态生成它。我一生都无法弄清楚这里发生了什么。它似乎不是任何一种双重编码,我只是有点困惑为什么这不起作用。

起初我认为这可能与 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

【问题讨论】:

  • 您是否在 Facebook 应用设置中设置了主机 url 或基本 url?
  • 是的,我的网站网址设置为该网站的当前实时版本,并且我的应用程序域部分列出了本地主机版本。尽管如此,我的简单示例设置了所有正确的 localhost url,例如 simple.localhost 是站点 url,而我的应用程序域只包含 simple.localhost。如果你不添加它,facebook 总是在网站 url 中附加 /
  • 你能把fb异常也贴在这里吗?
  • 我已经用它更新了问题
  • 我解决了,答案贴在下面

标签: php facebook facebook-php-sdk


【解决方案1】:

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

所以我现在只使用

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

【讨论】:

  • 谢谢伙计。我有同样的问题,这解决了它。我正在使用 request_uri,当 facbook 返回应用程序时,它发送 code=xxxxx .. 这与初始 url 不同。这就是错误的原因。 :)
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多