我尝试了 stackoverflow 上的几种解决方案来解决这个问题,但没有人提供帮助,所以我打开了一个新的解决方案,希望有人能帮助我找到解决方案。
Facebook PHP API 用于登录门户网站,但在用户单击登录链接并接受范围后,我没有获得任何用户详细信息。
$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'
);
查看application/view/index/loginForm.php
该 View 包含 Facebook 身份验证 Controller 的链接。
...
<a href="<?= base_url('login/doLogin?facebook') ?>" class="btn facebook">
Facebook Login
</a>
...
Controller 应用程序/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 并接受范围。
- 然后用户会被重定向到正确的重定向网址。
- 函数
_facebook_login
现在应该从代码中获取一个 token ,并且通过该 token ,用户的电子邮件应该位于$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.
最佳答案
据我所知,整个脚本都搞砸了。这是我的建议
1. 在 Controller 中创建一个常用函数facebook_login
2.每当用户点击“login with facebook”时,调用 Controller facebook_login
Controller :
public 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');
var_dump($user_profile);
}catch (FacebookApiException $e)
{
$user = null;
log_message('error', $e);
return FALSE;
}
}else{
$loginUrl = $this>facebook>getLoginUrl();
header("Location:$loginUrl");
}
}
查看:
<a href="<?php echo(base_url()); ?>controller/facebook_login" class="btn facebook">
Login with facebook
</a>
关于facebook - Codeigniter Facebook 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294858/