Codeigniter,Facebook javascript SDK,PHP登录后的PHP重定向没有getUser()直到刷新

Joh*_*n C 6 php facebook codeigniter facebook-javascript-sdk facebook-php-sdk

该过程如下.

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.
Run Code Online (Sandbox Code Playgroud)

一切正常,除了唯一的问题是在被重定向到登录页面之后Connect返回False,当它实际上应该是真的正义fbuser登录并且已经授予了perms.如果我刷新但一切正常,则用户登录(如果存在)或者如果将新内容发送到注册页面.以下是我的代码..

      <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>
Run Code Online (Sandbox Code Playgroud)

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;    
}
Run Code Online (Sandbox Code Playgroud)

身份验证/登录代码(仅涉及facebook的部分)

 $this->load->module('facebook/fbconnect')->connect(); 
Run Code Online (Sandbox Code Playgroud)

小智 6

好吧,我似乎已经想到了这一点.我对javascript做了这个改动:

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

我想通过添加FB.api('/ me',function(response){}); 它以某种方式使getUser()返回true.如果其他人有getUser()返回0试试这个.无论如何,我希望这有助于其他人:)