Facebook CodeIgniter - 首次尝试无法登录

时间:2012-07-10 11:05:56

标签: php facebook codeigniter facebook-login

我正在使用Facebook PHP与CodeIgniter集成。 我有一个问题,我点击登录链接,它带我到Facebook登录,我成功登录,当它重定向回我的页面时,没有任何Facebook信息通过。然后,如果我再次单击登录链接,它会立即登录我,而无需Facebook登录表单。如果我要刷新页面而不是第二次点击登录链接,Facebook信息仍然不会显示。

我觉得这与会话有关。

$facebook = $this->facebook;
$user = $facebook->getUser();

$ user 始终为0,直到我第二次点击登录链接。 这是登录流程:enter image description here
我觉得好像它在 GET / Oath / authorize 阶段失败了。

public function fb_login() {
    $facebook = $this->facebook;

    // Get User ID
    $user = $facebook->getUser();
    $this->session->set_userdata(array('user' => $user));

    var_dump($user);

    $profile = null;
    $logoutUrl = null;
    $loginUrl = null;

    try {
        $profile = $facebook->api('/me');
        $this->session->set_userdata(array('profile' => $profile));
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }

    if ($user) {
        $url = $this->uri->uri_string();
        $url = str_replace('/', '-', $url);
        $logoutUrl = $facebook->getLogoutUrl(array(
            'next' => site_url('[omitted]/fb_logout'.'/'.$url)));
        $this->session->set_userdata(array('logoutUrl' => $logoutUrl));
    } else {
        $loginUrl = $facebook->getLoginUrl(array('display' => 'touch'));
        $this->session->set_userdata(array('loginUrl' => $loginUrl));
    }

    $facebook_array = array(
        'user' => $user,
        'profile' => $profile,
        'logoutUrl' => $logoutUrl,
        'loginUrl' => $loginUrl
    );
    return $facebook_array;
}

public function view_events($organiser_type) {
    $this->load->helper('form');
    $organiser_type = urldecode($organiser_type);
    $data['organiser_type'] = $organiser_type;

    $data['title'] = $organiser_type.' Events';
    $data['events'] = $this->trinity_impulse_model->get_events_by_type(
            $organiser_type, 
            array('event_start_date', 'event_start_time'),
            array('asc', 'asc'));

    $i = 0;
    foreach ($data['events'] as $event) {
        $data['events'][$i]['event_start_date'] = format_timestamp_to('dateFromDB', $event['event_start_date']);
        $data['events'][$i]['event_end_date'] = format_timestamp_to('dateFromDB', $event['event_end_date']);

        $data['events'][$i]['event_start_date'] = humanise_date($data['events'][$i]['event_start_date']);
        $data['events'][$i]['event_end_date'] = humanise_date($data['events'][$i]['event_end_date']);
        $data['events'][$i]['event_start_time'] = format_timestamp_to('shorttime', $event['event_start_time']);
        $data['events'][$i++]['event_end_time'] = format_timestamp_to('shorttime', $event['event_end_time']);
    }        


    $facebook_array = $this->fb_login();

    var_dump($this->session->userdata('user'));
    // Get session values.
    /*$data['user'] = $this->session->userdata('user');

    $data['profile'] = $this->session->userdata('profile');
    $data['loginUrl'] = $this->session->userdata('loginUrl');

    $data['logoutUrl'] = $this->session->userdata('logoutUrl');
    */
    $data['user'] = $facebook_array['user'];

    $data['profile'] = $facebook_array['profile'];
    $data['loginUrl'] = $facebook_array['loginUrl'];

    $data['logoutUrl'] = $facebook_array['logoutUrl'];


    $this->load->view('[omitted]/view_events', $data);
}

编辑:我的应用程序中的其他页面正常工作。登录首次尝试显示Facebook数据。其他页面没有什么不同。它们都以相同的方式使用 fb_login()函数。

EDIT2:我做了 var_dump($ facebook),看看失败登录时变量的不同之处。当我遇到问题时,我发现状态已设置。如果没有设置,它会毫无问题地登录。我仍然不知道如何解决这个问题。这是 var_dump()

["state":protected]=> string(32) "ac816d6fa8fba908b6bd01f3e7f0ec75"

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题 我不知道问题的原因是什么,但我修改了代码,现在它可以工作了。令人讨厌的代码是:

try {
    $profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
}

我将 if 包裹起来,以便仅在实例化 $ user 变量时调用它。代码是这样的:

if ($user) {
    try {
            $profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}