FacebookProvider.php 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace Muzich\CoreBundle\Security\User\Provider;
  3. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  4. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  5. use Symfony\Component\Security\Core\User\UserProviderInterface;
  6. use Symfony\Component\Security\Core\User\UserInterface;
  7. use \BaseFacebook;
  8. use \FacebookApiException;
  9. class FacebookProvider implements UserProviderInterface
  10. {
  11. /**
  12. * @var \Facebook
  13. */
  14. protected $facebook;
  15. protected $userManager;
  16. protected $validator;
  17. public function __construct(BaseFacebook $facebook, $userManager, $validator)
  18. {
  19. $this->facebook = $facebook;
  20. $this->userManager = $userManager;
  21. $this->validator = $validator;
  22. }
  23. public function supportsClass($class)
  24. {
  25. return $this->userManager->supportsClass($class);
  26. }
  27. public function findUserByFbId($fbId)
  28. {
  29. return $this->userManager->findUserBy(array('facebook_id' => $fbId));
  30. }
  31. public function findUserByEmail($email)
  32. {
  33. return $this->userManager->findUserBy(array('email' => $this->userManager->canonicalizeEmailLocal($email)));
  34. }
  35. public function loadUserByUsername($username)
  36. {
  37. $user = $this->findUserByFbId($username);
  38. try {
  39. $fbdata = $this->facebook->api('/me');
  40. } catch (FacebookApiException $e) {
  41. throw new UsernameNotFoundException('The user is not authenticated on facebook');
  42. $fbdata = null;
  43. }
  44. $user = $this->findUserByEmail($fbdata['email']);
  45. if (!empty($fbdata)) {
  46. if (empty($user)) {
  47. $user = $this->userManager->getNewReadyUser();
  48. $user->setFBData($fbdata);
  49. }
  50. if (count($this->validator->validate($user, 'Facebook'))) {
  51. throw new UsernameNotFoundException('The facebook user could not be stored');
  52. }
  53. $this->userManager->updateUser($user);
  54. }
  55. if (empty($user)) {
  56. throw new UsernameNotFoundException('The user is not authenticated on facebook');
  57. }
  58. return $user;
  59. }
  60. public function refreshUser(UserInterface $user)
  61. {
  62. if (!$this->supportsClass(get_class($user)) || !$user->getFacebookId()) {
  63. throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
  64. }
  65. return $this->loadUserByUsername($user->getFacebookId());
  66. }
  67. }