grom/facebook-service-provider

该包已被废弃,不再维护。未建议替代包。

将Facebook API和connect集成到您的Silex应用中

v1.1.0 2014-03-08 21:19 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:23:42 UTC


README

FacebookServiceProvider将Facebook Connect和API添加到您的应用中。

它将FOSFacebookBundle集成到Silex中。

参数

  • facebook.config: 您Facebook应用的配置。(appId, secret, fileUpload,)
  • facebook.permissions: 连接所需的权限列表。
  • facebook.session_prefix: Facebook数据的前缀。

服务

安装

使用composer

composer require grom/facebook-service-provider

注册

首先,您必须注册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'),
));

认证

要使用Facebook Connect认证用户,首先需要注册SecurityServiceProvider

要启用Facebook认证,只需将“facebook”选项添加到您的防火墙配置中。

$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),
        ),
    ),
);

如果您没有设置login_path,则用户将被重定向到Facebook。

嵌入式Facebook应用的开发者可以定义app_urlserver_urldisplay选项。

定义自定义用户提供者和自动用户创建

用于查找Facebook用户的UserProvider类似于username/password UserProvider。不同之处在于用户通过Facebook UID而不是用户名进行标识。

如果Facebook UID在您的数据库中找不到,用户提供者可以自动创建用户。您只需实现方法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';
    }
}

现在使用您的自定义用户提供者。

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

Facebook Graph API

一旦用户通过Facebook认证,您就可以进行Facebook Graph API请求。

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

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

查看Facebook Graph Explorer