2

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

登录步骤

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

2 回答 2

2

据我说,整个剧本都搞砸了。这是我的建议
1. 在控制器中创建一个通用函数 facebook_login
2. 每当用户 clciks “使用 facebook 登录”时,调用控制器 facebook_login

控制器:

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>
于 2013-06-25T11:12:09.410 回答
0

最后我找到了解决方案。

该选项'sharedSession' => true导致了问题,在我删除它后,我得到了用户数据。

于 2013-06-25T14:32:23.917 回答