我在使用新的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
答案 0 :(得分:1)
我已经解决了这个问题。这是我的愚蠢。当使用$ _SERVER ['REQUEST_URI']生成登录URL时,它显然会在第二次运行时返回为“/”,再次实例化它,但这次返回的查询字符串在其中,因此重定向的uri设置在辅助类不再与基础uri相同。基本上我需要没有查询字符串的请求uri
所以现在我只使用
$_SERVER['HTTP_HOST']. strtok($_SERVER['REQUEST_URI'], '?')