我尝试使用带有codeigniter的facebook PHP-SDK为我的网站实现facebook登录,方法如下:https://shareurcodes.com/blog/facebook%20php%20sdk%20v5%20with%20codeigniter
从我在其他问题上看到的这个问题,我检查了给定的答案/常见错误,但http://localhost/fbcallback
已经在我的应用程序的有效OAuth重定向URI和推送/删除' / '从网址的末尾没有帮助。
我在第一个创建了两个控制器:fblogin.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Fblogin extends CI_Controller{
public function index(){
require_once '{path}/Facebook/autoload.php';
$fb = new Facebook\Facebook([
'app_id' => '{app-id}',
'app_secret' => '{app-secret}',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['email','user_location','user_birthday','publish_actions'];
// For more permissions like user location etc you need to send your application for review
$loginUrl = $helper->getLoginUrl('http://localhost/fbcallback', $permissions);
header("location: ".$loginUrl);
}
}
第二个:fbcallback.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Fbcallback extends CI_Controller{
public function index(){
require_once '{path}/Facebook/autoload.php';
$fb = new Facebook\Facebook([
'app_id' => '{app-id}',
'app_secret' => '{app-secret}',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
if (isset($_GET['state'])) {
$helper->getPersistentDataHandler()->set('state', $_GET['state']);
}
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
try {
// Get the Facebook\GraphNodes\GraphUser object for the current user.
// If you provided a 'default_access_token', the '{access-token}' is optional.
$response = $fb->get('/me?fields=id,name,email,first_name,last_name,birthday,location,gender', $accessToken);
// print_r($response);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'ERROR: Graph ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'ERROR: validation fails ' . $e->getMessage();
exit;
}
// User Information Retrieval begins................................................
$me = $response->getGraphUser();
$location = $me->getProperty('location');
echo "Full Name: ".$me->getProperty('name')."<br>";
echo "First Name: ".$me->getProperty('first_name')."<br>";
echo "Last Name: ".$me->getProperty('last_name')."<br>";
echo "Gender: ".$me->getProperty('gender')."<br>";
echo "Email: ".$me->getProperty('email')."<br>";
echo "location: ".$location['name']."<br>";
echo "Birthday: ".$me->getProperty('birthday')->format('d/m/Y')."<br>";
echo "Facebook ID: <a href='https://www.facebook.com/".$me->getProperty('id')."' target='_blank'>".$me->getProperty('id')."</a>"."<br>";
$profileid = $me->getProperty('id');
echo "</br><img src='//graph.facebook.com/$profileid/picture?type=large'> ";
echo "</br></br>Access Token : </br>".$accessToken;
}
}
当我转到http://localhost/fblogin
时,它会询问必要的权限(电子邮件,用户位置,用户生日,发布操作),但在我提供权限并重定向到http://localhost/fbcallback
后,我收到以下错误:< br />
图表返回错误:验证验证码时出错。请确保您的redirect_uri与您在OAuth对话框请求中使用的redirect_uri相同。
当我在玩的时候,我意识到我是否更改了$loginUrl
变量
vendor / facebook / graph-sdk / src / Facebook / Authentication / OAuth2Client.php到http://localhost/fbcallback
,如下所示,一切按预期工作。所以我怀疑在传递$ loginUrl参数时可能存在问题,并且跟踪了我的代码但是找不到任何问题。
public function getAuthorizationUrl($loginUrl, $state, array $scope = [], array $params = [], $separator = '&')
{
$params += [
'client_id' => $this->app->getId(),
'state' => $state,
'response_type' => 'code',
'sdk' => 'php-sdk-' . Facebook::VERSION,
'redirect_uri' => 'http://localhost/fbcallback', //instead of {$redirectUrl}
'scope' => implode(',', $scope)
];
让我感到困惑的是,如果我更改服务器的DocumentRoot并使用facebook-sdk库复制上述两个控制器,那么在新目录中一切正常。那么也许与当前目录中的一个文件存在冲突?我搜索了它但却找不到任何可能发生冲突的东西。
提前致谢!
答案 0 :(得分:0)
getAccessToken
的{{1}}方法会生成API请求网址,以交换包含FacebookRedirectLoginHelper
参数的令牌代码。
如果在调用方法时未明确指定此参数,则会在内部确定并回退到当前脚本URL /路由。
因此,只要您处理生成登录URL并在同一路径resp下处理生成的代码参数,这样就可以在不指定重定向URI的情况下工作。在相同的脚本URL下;但如果这两者不同,那么你需要在调用redirect_uri
时指定它。