0

Facebook PHP と CodeIgniter の統合を使用しています。ログイン リンクをクリックすると、Facebook のログイン画面が表示され、正常にログインできますが、自分のページにリダイレクトされたときに、Facebook の情報がまったく取得されないという問題があります。次に、ログイン リンクをもう一度クリックすると、Facebook のログイン フォームがなくてもすぐにログインできます。ログイン リンクを 2 回クリックする代わりにページを更新すると、Facebook の情報は表示されません。

それはセッションと関係があると感じています。

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

ログインリンクを 2 回目にクリックするまで、 $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;
}

$user変数がインスタンス化された場合にのみ呼び出されるように、 ifをラップしました。コードは次のようになります。

if ($user) {
    try {
            $profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}
于 2012-07-10T13:53:28.217 に答える