facebook - Codeigniter Facebook 登录失败

标签 facebook codeigniter codeigniter-2 facebook-login

我尝试了 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);
}

登录步骤

  1. 点击 Facebook 登录链接后,用户将被重定向到 Facebook。
  2. 用户正在登录 Facebook 并接受范围。
  3. 然后用户会被重定向到正确的重定向网址。
  4. 函数_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/

相关文章:

javascript - 窗口内弹出

php - 如何分配评论ID?

PHP字符串函数获取数组字符串值中字符串的特定行

php - 更好的AWS实例

php - codeIgniter 将解析器结果分配给变量

Facebook Like Box 不随机显示图像

android - Facebook "feed"对话框显示问题

facebook - 有没有一种简单的方法可以找到 Facebook 用户的 ID?

php - IIS 上带有 web.config 文件的 Codeigniter 2

php - 使用 Pdo 的 Codeigniter 发出对成员函数 rowCount() 的调用