GromNaN / FacebookServiceProvider

Facebook API and connect integration into your Silex applications
MIT License
25 stars 6 forks source link

more detailed example needed #1

Closed freekmurze closed 11 years ago

freekmurze commented 11 years ago

Hi,

i'm have troubles integrating this component. Could you please provided a more detailed example on how to integrate this in silex?

I'm trying to secure the /admin-area. Users should login via facebook.

Right now I have this in my index.php.

$app->register(new Silex\Provider\SessionServiceProvider());

$app->register(new Silex\Provider\FacebookServiceProvider(), array(
    'facebook.config' => array(
        'appId'      => '<appid>',
        'secret'     => '<app secret>',
        'fileUpload' => false, // optional
    ),
    'facebook.permissions' => array('email'),
));

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'private' => array(
            'pattern' => '^/admin/',
            'facebook' => array(
                'check_path' => '/admin/logincheck/',
                //'login_path' => '/',
            ),
            // Users are identified by their Facebook UID
            'users' => array(
                //Freek
                '<user id of user>' => array('ROLE_USER', null),
            ),
        ),
    )));

$app->boot();

In my facebook app i've added /admin/logincheck as my site url. When loggin in on facebook, I get redirect back to my domain, but then I get an errormessage that the route /admin/logincheck/ is not defined. When I define that route an extra redirect is performed to /login/. When I define /login, the browser gets stuck in a redirectloop.

I have these questions:

Could you please make an example in which these questions are answered. I'm sure that other silex beginners will benefit from this as well.

GromNaN commented 11 years ago

Hi,

I've just tested the following that works fine:


<?php

/**
 * php -S localhost:8080 -t demo.php
 * Go to http://silex.dev:8080/secured/me
 */

require __DIR__ . '/vendor/autoload.php';

$app = new Silex\Application();

$app->register(new Silex\Provider\SessionServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->register(new Silex\Provider\FacebookServiceProvider());

$app['facebook.config'] = array(
    'appId' => '<appId>',
    'secret' => '<secret>',
);
$app['facebook.permissions'] = array('email');
$app['security.firewalls'] = array(
    'private' => array(
        'pattern' => '^/admin/',
        'facebook' => array(
            'check_path' => '/admin/login_check',
            // 'login_path' => '/login',
            //'entry_point' => true,
        ),
        'users' => array(
            '<myid>' => array('ROLE_USER', null),
        ),
    ),
);

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

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

$app->run();

If the user id or the facebook credentials are incorrect, there is effectively no error message and you are redirected to the /login page.

freekmurze commented 11 years ago

I tried to run your example (I remove all my own code for the application) and I still get the error. The redirect to Facebook works, when I return from Facebook a "NotFoundHttpException" is thrown. This is the entire error:

Sorry, the page you are looking for could not be found.

2/2NotFoundHttpException: No route found for "GET /login" in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php line 94 at RouterListener->onKernelRequest(object(GetResponseEvent)) at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent)) in /vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 164 at EventDispatcher->doDispatch(array(array(object(SessionServiceProvider), 'onEarlyKernelRequest'), array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(Firewall), 'onKernelRequest'), array(object(MiddlewareListener), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in /vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 53 at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 110 at HttpKernel->handleRaw(object(Request), '1') in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 73 at HttpKernel->handle(object(Request), '1', true) in /vendor/silex/silex/src/Silex/Application.php line 504 at Application->handle(object(Request)) in /vendor/silex/silex/src/Silex/Application.php line 481 at Application->run() in /public_html/index.php line 39 1/2ResourceNotFoundException: in /vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php line 91 at UrlMatcher->match('/login') in /vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php line 30 at RedirectableUrlMatcher->match('/login') in /vendor/silex/silex/src/Silex/LazyUrlMatcher.php line 51 at LazyUrlMatcher->match('/login') in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php line 80 at RouterListener->onKernelRequest(object(GetResponseEvent)) at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent)) in /vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 164 at EventDispatcher->doDispatch(array(array(object(SessionServiceProvider), 'onEarlyKernelRequest'), array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(Firewall), 'onKernelRequest'), array(object(MiddlewareListener), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in /vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 53 at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 110 at HttpKernel->handleRaw(object(Request), '1') in /vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 73 at HttpKernel->handle(object(Request), '1', true) in /vendor/silex/silex/src/Silex/Application.php line 504 at Application->handle(object(Request)) in /vendor/silex/silex/src/Silex/Application.php line 481 at Application->run() in /public_html/index.php line 39

My index.php

ini_set("display_errors", 1);
error_reporting(E_ALL);
require_once __DIR__ . '/../vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\SessionServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->register(new Silex\Provider\FacebookServiceProvider());

$app['facebook.config'] = array(
    'appId' => '<app id>',
    'secret' => '<app secret>',
);
$app['facebook.permissions'] = array('email');
$app['security.firewalls'] = array(
    'private' => array(
        'pattern' => '^/admin/',
        'facebook' => array(
            'check_path' => '/admin/login_check',
            // 'login_path' => '/login',
            //'entry_point' => true,
        ),
        'users' => array(
            '<my own facebook id>' => array('ROLE_USER', null),
        ),
    ),
);

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

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

$app->run();

My composer.json

{
    "require": {
        "silex/silex": "1.0.*@dev",
        "symfony/form" : "2.1.*",
        "twig/twig": ">=1.8,<2.0-dev",
        "symfony/twig-bridge": "v2.2.1",
        "symfony/translation": "~2.1",
        "symfony/validator": "~2.1",
        "symfony/config": "2.2.x-dev",
        "doctrine/dbal": "2.3.3",
        "swiftmailer/swiftmailer": "4.1.7",
        "guzzle/guzzle": "dev-master",
        "grom/facebook-service-provider": "dev-master"
    }
}
freekmurze commented 11 years ago

Found the solution. It turns out that my .htaccess url rewrite did not send the get-parameters to index.php Changing RewriteRule (.*) /index.php?param=$1 [L] to RewriteRule (.*) /index.php?param=$1 [QSA,L] fixed the problem

GromNaN commented 11 years ago

Great! Thanks for the feedback. I've just opened a PR on Silex doc for that.