Using Facebook PHP-SDK 3.x to register/login user

2019-01-17 18:21发布

问题:

Going over the Facebook API and I'm a bit confused on the right approach. I want users to skip registration, or auto-register them if they sign in with Facebook. So if they sign into Facebook I collect their id, email and create a record in my user table.

If an id exists already in the user table they skip the auto-registration and go directly to the members page. This is my code so far (taken from Facebook's PHP SDK example). When I run the signup script the page shows up as blank, I do not get redirected.

EDIT: seems to be failing right after the require, if I use the following code 'test' never gets printed.

EDIT: I'm using Codeigniter and this script is part of a controller, would that cause a problem with the require?

require 'http://localhost/facebook-php-sdk-6c82b3f/src/facebook.php';
echo "test";

-

public function signup()
    {   
        require 'http://localhost/facebook-php-sdk-6c82b3f/src/facebook.php';

        // Create our Application instance (replace this with your appId and secret).
        $facebook = new Facebook(array(
          'appId'  => 'xxxxxxxxxxxxxxx',
          'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
        ));

        // Get User ID
        $user = $facebook->getUser();

        // We may or may not have this data based on whether the user is logged in.
        //
        // If we have a $user id here, it means we know the user is logged into
        // Facebook, but we don't know if the access token is valid. An access
        // token is invalid if the user logged out of Facebook.

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

        // Login or logout url will be needed depending on current user state.
        if ($user)
        {
            $logoutUrl = $facebook->getLogoutUrl();
        }
        else
        {
            $loginUrl = $facebook->getLoginUrl(array('scope' => 'email'));
            redirect($loginUrl);
        }

        print_r($user_profile);


        $this->load->model("user_model");
        $privileges = 1;
        $loginLocation = ip2long($_SERVER['REMOTE_ADDR']);
        $active = 1;
        $this->user_model->add_user($user_profile->id, $user_profile->name, $user_profile->email, $loginLocation, $privileges, $active);

    }

回答1:

I suggest you read the framework documentation. Adding a library to CodeIgniter is not a hard task. And Facebook library is no exception.

Here's a quick integration I've just come up with:

1.create a config file:application/config/facebook.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['appId'] = 'app_id';
$config['secret'] = 'app_secret';

2.place the sdk files in the libraries folder application/libraries/ and rename the facebook.php file to Facebook.php and replace the php tag with this:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

3.in your controller load the config file and then load the Facebook library:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        // Your own constructor code
        $CI = & get_instance();
        $CI->config->load("facebook",TRUE);
        $config = $CI->config->item('facebook');
        $this->load->library('facebook', $config);
    }

    public function index()
    {
        $user = $this->facebook->getUser();
        if($user) {
            try {
                $user_info = $this->facebook->api('/me');
                echo '<pre>'.htmlspecialchars(print_r($user_info, true)).'</pre>';
            } catch(FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
                $user = null;
            }
        } else {
            echo "<a href=\"{$this->facebook->getLoginUrl()}\">Login using Facebook</a>";
        }
    }
}

Now in the constructor method, you have just initialized the Facebook library (sdk) and it can be accessed by using: $this->facebook.

Notes:

  • You can always use an existing library, just google it
  • A common practice is to extend the core Controller class and add the Facebook library initialization there.
  • Or create another library, extend the Facebook library, load the config file there and then autoload this new library.


回答2:

After getting the $user, check session parameters with print_r($_SESSION). After that, check some variables by if(isset($_SESSION['some session var'])). If this condition is true, then navigate to your main page with header("location:main.php"); exit;



回答3:

You can try using my extension http://github.com/deth4uall/Facebook-Ignited it is set up to work with Facebook. Just update the config file and it will allow you to do what you need to do, as well as some additional methods that I added myself.



回答4:

do not know why, but it always runs this line:

echo "<a href=\"{$this->facebook->getLoginUrl()}\">Login using Facebook</a>";

This is the error message:

couldn't connect to host

But this worked.