6

このプロセスは次のとおりです。Codeignitor、Facebook javascript SDK、PHP SDK Facebookのログイン後にリダイレクトすると、リフレッシュまでgetUser()がリフレッシュされます

1. User clicks Facebook Login button 
2. User signs in and grants perms 
3. Facebook redirects uses FB.Event.subscribe auth.login to redirect my login controller 
4. My login controller loads the fbconnect module and chains the method Connect() 
5. Connect() Checks if there is a facebook user using getUser() and if true checks if they are an existing user to log them in or returns false if no facebook user was found. 

すべてが唯一の問題は、それが実際にfbuserがログインしているとパーマを付与している真のサインであるべきときに接続がFalseを返すログインページにリダイレクトされた後であることを除い動作します。しかし、すべてを更新すると、ユーザーはログインしているか、新規のサインアップページが送信されます。以下は私のコード..

 <div id="fb-root"></div> 
    <script> 
     //initializing API 
     window.fbAsyncInit = function() { 
     FB.init({appId: '(My app id)', status: true, cookie: true, 
       xfbml: true, // channel.html file 
       oauth : true 
       }); 
       FB.Event.subscribe('auth.login', function(response) { 
       window.location='http://www.(Mysite).com/login'; 
       }); 
       FB.Event.subscribe('auth.logout', function(response) { 
       window.location='http://www.(Mysite).com/logout'; 
       }); 
       }; 
     (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 

はFbconnect.php

class Fbconnect extends MX_Controller { 
public $fb_user = null; 
public $fb_user_id = null; 

// Initilize Fabebook 
public function __construct() 
{ 
    parent::__construct(); 
    $this->config->load("facebook"); 
    require 'facebook.php'; 

    $this->facebook = new Facebook(array(
     'appId' => $this->config->item('appId'), 
     'secret' => $this->config->item('Secret') 
    )); 


    // Get user from FB 
    $this->fb_user_id = $this->facebook->getUser(); 

    if ($this->fb_user_id): 
     try { 
     // Proceed knowing you have a logged in user who's authenticated. 
     $this->fb_user = (object)$this->facebook->api('/me'); 
     } catch (FacebookApiException $e) { 
     error_log($e); 
     $this->fb_user = null; 
     } 
    endif; 

} 


public function connect(){ 

    // Check for FB object 
    if($this->fb_user): 
     // FB Object found 
      // Check if user exists 
      $this->load->model('facebook/m_facebook'); 
      $user = $this->m_facebook->getUser($this->fb_user->id); 

      // If we find a user and fb connect is true 
      if($user): 
       // user found log them in 
       if($this->ion_auth->login($user->username, $user->password, true, true)): 
        redirect('', 'refresh'); 
       endif; 
      else: 
      // There is a fb object & the user is not logged in & doesnt exist in db yet must be new 
       redirect('signup/facebook', 'refresh'); 
      endif; 
    else: 
     // No FB user or user not logged in         
     return false; 
    endif;  
} 

(ログインfacebookを伴う部分だけ)認証/ログインコード

$this->load->module('facebook/fbconnect')->connect(); 

は、任意の入力のために事前にありがとうですこの問題について。

+0

どのブラウザをお使いですか? FBは、クッキーが初めてSDKから取得されたときに読み取られない問題を修正しています(あなたが更新するためには更新する必要があります)。 – ifaour

答えて

6

私はこれを考え出したようです。私はJavaScriptにこの変更を加えた:

FB.Event.subscribe('auth.login', function(response) { 
    FB.api('/me', function(response) { 
    window.location.reload(); 
    }); 
}); 

IはFB.api( '/私'、関数(応答){})を加えることによってそれを推測します。それは何とかgetUser()をtrueに戻しました。他の誰かがgetUser()を返している場合は0を返します。とにかくこれが他人に役立つことを祈っています:)

+0

私はまったく同じ問題を抱えていますが、PHP SDKのみを使用しています。その場合にこの問題を解決する方法に関する提案はありますか? – eskimo

関連する問題