On 01.12.2010, at 17:37, Jeremy Mikola wrote:

> I've put this off because we're not yet using Security component.  In 
> response to what Ben mentioned, the FB login process is very view-centric 
> (and worse, OAuth-centric), so relying on the Javascript SDK is a quick win.
> 
> There's no reason you can't rely on JS to handle the login/registration flow, 
> and still create a provider.  The Security component provider would just have 
> to check for \Facebook::getUser(), which will return a FB UID if someone is 
> connected.  You can then resolve that FB UID to a database user.
> 
> Presenting the Javascript SDK as a login option would be up to the developer, 
> but it's outside the scope of the firewall in my opinion.
> 
> I would suggest that if anyone implements the above, they consider 
> contributing to:
> 
> https://github.com/kriswallsmith/FacebookBundle
> 
> It'd be more helpful to the community to build up an existing Facebook bundle 
> (which already has some essentials for connecting the API) than end up with 
> several competing ones.

I am not doen yet, but from initial testing things turned out to be quite easy.
I have both DB users as well as Facebook Users, but both have some data in the 
DB. So I decided to just modify my UserRepository to handle the two cases. As 
you can see I am injecting a Facebook PHP SDK instance which is already turned 
into a service by KrisFacebookBundle. Not sure if this code is worth 
contributing. Maybe once I have the subscription thing working, but its not yet 
cler if the client will want that implemented for the launch or not.

class UserRepository extends BaseUserRepository
{
    protected $facebook;

    public function setFacebook($facebook)
    {
        $this->facebook = $facebook;
    }

    /**
     * @see UserRepositoryInterface::findOneByUsername
     */
    public function findOneByFbId($fbId)
    {
        return $this->findOneBy(array('facebookID' => $fbId));
    }

    /**
     * Loads the user for the given username.
     *
     * This method must throw UsernameNotFoundException if the user is not
     * found.
     *
     * @param  string $username The username
     * @return AccountInterface A user instance
     * @throws UsernameNotFoundException if the user is not found
     */
    public function loadUserByUsername($username)
    {
        if (empty($username)) {
            if ($this->facebook->getSession()) {
                $fbID = $this->facebook->getUser();

                $em = $this->getEntityManager();
                $user = $this->findOneByFbId($fbID);
                if (!$user) {
                    $user = $this->createUserInstance();
                    $user->setPassword('');
                    $em->persist($user);
                }
                // TODO ideally we would subscribe to changes, so that we would 
not have to do this if the user already exists
                // TODO http://developers.facebook.com/docs/api/realtime
                $user->setFBData($this->facebook->api('/me'));

                // TODO validate the user
                $em->flush();
            }
        } else {
            $user = $this->findOneByUsername($username);
        }

        if (!$user) {
            throw new UsernameNotFoundException(sprintf('The user "%s" does not 
exist', $username));
        }

        return $user;
    }
}

regards,
Lukas Kahwe Smith
m...@pooteeweet.org



-- 
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to symfony-devs@googlegroups.com
To unsubscribe from this group, send email to
symfony-devs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en

Reply via email to