grom/facebook-service-provider

Facebook API and connect integration into your Silex applications


License
MIT

Documentation

FacebookServiceProvider

The FacebookServiceProvider adds Facebook Connect and API to your applications.

It integrates FOSFacebookBundle into Silex.

Parameters

  • facebook.config: Configuration of your Facebook application. (appId, secret, fileUpload, )
  • facebook.permissions: List of permissions required to connect.
  • facebook.session_prefix: Prefix for Facebook data.

Services

Installation

Using composer :

composer require grom/facebook-service-provider

Registering

First, you must register the SecurityServiceProvider.

use Silex\Provider\FacebookServiceProvider;

$app->register(new FacebookServiceProvider(), array(
    'facebook.config' => array(
        'appId'      => 'YOUR_APP_ID',
        'secret'     => 'YOUR_APP_SECRET',
        'fileUpload' => false, // optional
    ),
    'facebook.permissions' => array('email'),
));

Authentication

To authenticate users with Facebook Connect, first you need to register the SecurityServiceProvider.

To enable Facebook authentication, just add a "facebook" option to your firewall configuration.

$app['security.firewalls'] = array(
    'private' => array(
        'pattern' => '^/',
        'facebook' => array(
            'check_path' => '/login_check',
            'login_path' => '/login',
        ),
        // Users are identified by their Facebook UID
        'users' => array(
            // This is Mark Zuckerberg
            '4' => array('ROLE_USER', null),
        ),
    ),
);

If you don't set a login_path, the user is redirected to Facebook.

Developers of embedded Facebook Applications may define app_url, server_url and display options.

Defining a custom User Provider and automatic user creation##

The UserProvider used to find Facebook user is similar to the username/password UserProvider. The differences are that users are identified by their Facebook UID instead of their username.

If the Facebook UID is not found in your database, the user provider can create the user automatically. You simply have to implements the method FOS\FacebookBundle\Security\User\UserProviderInterface::createUserFromUid

use FOS\FacebookBundle\Security\User\UserManagerInterface as FacebookUserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\User;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Doctrine\DBAL\Connection;

class FacebookUserProvider implements FacebookUserProviderInterface
{
    private $conn;

    public function __construct(Connection $conn)
    {
        $this->conn = $conn;
    }

    public function loadUserByUsername($uid)
    {
        $stmt = $this->conn->executeQuery('SELECT * FROM users WHERE username = ?', array($uid));

        if (!$user = $stmt->fetch()) {
            throw new UsernameNotFoundException(sprintf('Facebook UID "%s" does not exist.', $uid));
        }

        return new User($user['username'], null, explode(',', $user['roles']), true, true, true, true);
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $this->loadUserByUsername($user->getUsername());
    }

    public function createUserFromUid($uid)
    {
        $this->conn->insert('users', array(
            'username' => $uid,
            'roles'    => 'ROLE_USER',
        ));

        return $this->loadUserByUsername($uid);
    }

    public function supportsClass($class)
    {
        return $class === 'Symfony\Component\Security\Core\User\User';
    }
}

Now use your custom user provider.

$app['security.firewalls'] = array(
    'default' => array(
        'facebook' => array(
        ),
        'users' => $app->share(function () use ($app) {
            return new FacebookUserProvider($app['db']);
        }),
    ),
);

Facebook Graph API

Once a user is authenticated with Facebook, you can make Facebook Graph API requests.

$app->get('/', function () use ($app) {
    $user = $app['facebook']->api('/me');

    return 'Welcome ' . $user['name'];
});

Look at the Facebook Graph Explorer.