我尝试了 stackoverflow 的几种解决方案来解决这个问题,但没有人提供帮助,所以我正在打开一个新的,希望有人能帮助我找到解决方案。
Facebook PHP API用于Login to a Webportal ,但在用户单击登录链接并接受范围后,我没有获得任何用户详细信息。
$this->facebook->getUser()
总是返回0
。
Facebook PHP 文件 facebook.php、base_facebook.php 和 fb_ca_chain_bundle.crt 存储在application/libraries/facebook/
.
Facebook 配置文件 application/config/development/facebook.php
$config['credentials'] = array(
'appId' => 'the_app_id',
'secret' => 'the_app_secret',
'sharedSession' => true,
'trustForwarded' => true,
'cookie' => true
);
$config['login'] = array(
'domain' => 'test.domain.com',
'scope' => 'email',
//this url is also defined in the facebook app for Login Action
'redirect_uri' => 'http://test.domain.com/login/doLogin?facebook'
);
查看应用程序/view/index/loginForm.php
该视图包含指向 Facebook 身份验证控制器的链接。
...
<a href="<?= base_url('login/doLogin?facebook') ?>" class="btn facebook">
Facebook Login
</a>
...
控制器应用程序/controllers/login.php
该函数doLogin
正在检查请求的登录方法并调用处理身份验证的相应函数。
public function doLogin() {
$is_login = FALSE;
//Facebook Login
if ($this->input->get('facebook') !== FALSE) {
//set get params to $_REQUEST Array for internal checks of the facebook library
//because Codeigniter handles the input by it's own class input
$_REQUEST = array(
'code' => $this->input->get('code'),
'state' => $this->input->get('state')
);
$is_login = $this->_facebook_login();
} elseif (){
//other Login Method
}
...
//do some other stuff depending on $is_login e.g. redirects user to the correct url or show error
}
protected function _facebook_login() {
$this->load->config('facebook');
$fb_cred = $this->config->item('credentials');
$this->load->library('facebook/facebook', $fb_cred);
$user = $this->facebook->getUser();
if ($user) {
try {
$user_profile = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
$user = null;
log_message('error', $e);
return FALSE;
}
var_dump($user_profile);
return TRUE;
}
//User is not logged in via Facebook, so redirect him to the Facebook Login page
$fb_login_conf = $this->config->item('login');
$loginUrl = $this->facebook->getLoginUrl($fb_login_conf);
redirect($loginUrl);
}
登录步骤
- 单击 Facebook 登录链接后,用户将被重定向到 Facebook。
- 在那里,用户正在登录 Facebook 并接受范围。
- 然后用户被重定向到正确的重定向 URL。
- 该函数
_facebook_login
现在应该从代码中获取一个令牌,并且使用该令牌,用户的电子邮件应该在$user_profile
.
根据好奇编码器的建议编辑了代码。
现在浏览器返回错误Error 310 (net::ERR_TOO_MANY_REDIRECTS)
不找用户的尝试
$this->load->config('facebook');
$fb_cred = $this->config->item('credentials');
$this->load->library('facebook/facebook', $fb_cred);
$user = $this->facebook->getUser();
try {
$user_profile = $this->facebook->api('/me');
var_dump($user_profile);
} catch (FacebookApiException $e) {
$user = null;
log_message('error', $e);
return FALSE;
}
在 Apache 日志中抛出以下错误消息
[error] [client ***.***.***.***] CSRF state token does not match one provided., referer: http://test.domain.com/login/doLogin?facebook
并在 Codeigniter 日志中
OAuthException: An active access token must be used to query information about the current user.