0

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

我觉得这与会话有关。

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

$user始终为 0,直到我第二次单击登录链接。这是登录流程:在此处输入图像描述
我觉得它在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"
4

1 回答 1

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;
    }
}
于 2012-07-10T13:53:28.217 回答