2016-08-20 6 views
0

소나타 사용자 번들을 HWIOAuthBundle과 통합하는 방법. HWIOAuthBundle에서 문서는 FOSUserBundle입니다. 그러나 NET에는 SonataUserBundle에 대한 문서가 없습니다. 나는 그물을 봤는데 아무 것도 발견하지 못했다. (그물) 내가 만든 HWIOAuthBundle의 문서 당으로 소나타 사용자 번들 및 HWIOAuthBundle

,

응용 프로그램 \ 소나타 \ UserBundle \ 엔티티 \ 사용자

/** 
    * @ORM\Column(name="facebook_id", type="string", length=255, nullable=true) 
    */ 
    private $facebookId; 

    private $facebookAccessToken; 
/** 
    * @param string $facebookId 
    * @return User 
    */ 
    public function setFacebookId($facebookId) 
    { 
     $this->facebookId = $facebookId; 

     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function getFacebookId() 
    { 
     return $this->facebookId; 
    } 

    /** 
    * @param string $facebookAccessToken 
    * @return User 
    */ 
    public function setFacebookAccessToken($facebookAccessToken) 
    { 
     $this->facebookAccessToken = $facebookAccessToken; 

     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function getFacebookAccessToken() 
    { 
     return $this->facebookAccessToken; 
    } 

내 Provider 클래스

public function connect(UserInterface $user, UserResponseInterface $response) { 
     $property = $this->getProperty($response); 
     $username = $response->getUsername(); 
     $service = $response->getResourceOwner()->getName(); 
     $setter = 'set' . ucfirst($service); 
     $setter_id = $setter . 'Id'; 
     $setter_token = $setter . 'AccessToken'; 
     if (null !== $previousUser = $this->userManager->findUserBy([$property => $username])) { 
      $previousUser->$setter_id(null); 
      $previousUser->$setter_token(null); 
      $this->userManager->updateUser($previousUser); 
     } 
     $user->$setter_id($username); 
     $user->$setter_token($response->getAccessToken()); 
     $this->userManager->updateUser($user); 
    } 

    public function loadUserByOAuthUserResponse(UserResponseInterface $response) { 
     $username = $response->getUsername(); 
     $user = $this->userManager->findUserBy([$this->getProperty($response) => $username]); 
     if (null === $user) { 
      $service = $response->getResourceOwner()->getName(); 
      $setter = 'set' . ucfirst($service); 
      $setter_id = $setter . 'Id'; 
      $setter_token = $setter . 'AccessToken'; 
      $user = $this->userManager->createUser(); 
      $user->$setter_id($username); 
      $user->$setter_token($response->getAccessToken()); 
      $user->setUsername($username); 
      $user->setEmail($response->getEmail()); 
      $user->setPlainPassword($response->getAccessToken()); 
      $user->setEnabled(TRUE); 
      $this->userManager->updateUser($user); 
      return $user; 
     } 
     $user = parent::loadUserByOAuthUserResponse($response); 
     $serviceName = $response->getResourceOwner()->getName(); 
     $setter = 'set' . ucfirst($serviceName) . 'AccessToken'; 
     $user->$setter($response->getAccessToken()); 
     return $user; 
    } 

그러나 오류가 발생했습니다.

Unrecognized field: facebookID

도 변경되었습니다. $setter_id = $setter . 'Id';$setter_id = $setter . 'Uid';으로 변경 했는데도 오류가 있습니다. UPDATE 01

소나타 사용자 개체에 따라 는 : 응용 프로그램 \ 소나타 \ UserBundle \ 엔티티 \ 사용자 에서

나는 $facebookID을 변경 (모든 관련 ...). 그러면 오류가 발생합니다. invalid password.

+0

http://inchoo.net/dev-talk/symfony-hwioauthbundle-and-google-sign-in/ –

답변

1

이 위치에서 답변을 얻었습니다. 그것은 단지 Google에 대한하지만 나는 또한 페이스 북을 추가했습니다. FOSUserBundle,

http://inchoo.net/dev-talk/symfony-hwioauthbundle-and-google-sign-in/

<?php 

/* 
* Copyright (C) 2016 sudhakar. 
* http://www.featuriz.com/licenses/LICENSE-2.0 
*/ 

namespace AppBundle\Service; 

use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider; 
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface; 
use Application\Sonata\UserBundle\Entity\User; 

/** 
* Description of OAuthProvider 
* 
* @author sudhakar 
*/ 
class OAuthProvider extends OAuthUserProvider { 

    protected $session, $doctrine, $admins, $oro = 'facebookUid'; 

    public function __construct($session, $doctrine, $service_container) { 
     $this->session = $session; 
     $this->doctrine = $doctrine; 
     $this->container = $service_container; 
    } 

    public function loadUserByUsername($username) { 

     $qb = $this->doctrine->getManager()->createQueryBuilder(); 
     $qb->select('u')->from('ApplicationSonataUserBundle:User', 'u')->where('u.' . $this->oro . ' = :oid')->setParameter('oid', $username)->setMaxResults(1); 
     $result = $qb->getQuery()->getResult(); 

     if (count($result)) { 
      return $result[0]; 
     } else { 
      return new User(); 
     } 
    } 

    public function loadUserByOAuthUserResponse(UserResponseInterface $response) { 
     $ro = $response->getResourceOwner()->getName(); 
     //Data from Google response 
     $oauth_id = $response->getUsername(); /* An ID like: 112259658235204980084 */ 
     $email = $response->getEmail(); 
     $nickname = $response->getNickname(); 
     $realname = $response->getRealName(); 
     $avatar = $response->getProfilePicture(); 

     //set data in session 
     $this->session->set('email', $email); 
     $this->session->set('nickname', $nickname); 
     $this->session->set('realname', $realname); 
     $this->session->set('avatar', $avatar); 

     //Check if this Google user already exists in our app DB 
     $qb = $this->doctrine->getManager()->createQueryBuilder(); 
     $this->oro = 'gplusUid'; 
     if ($ro == 'google') { 
      $this->oro = 'gplusUid'; 
     } elseif ($ro == 'facebook') { 
      $this->oro = 'facebookUid'; 
     } 
     $qb->select('u')->from('ApplicationSonataUserBundle:User', 'u')->where('u.' . $this->oro . ' = :oid')->setParameter('oid', $oauth_id)->setMaxResults(1); 
     $result = $qb->getQuery()->getResult(); 

     //add to database if doesn't exists 
     if (!count($result)) { 
//   $user = new User(); 
//   $user->setUsername($google_id); 
//   $user->setRealname($realname); 
//   $user->setNickname($nickname); 
//   $user->setEmail($email); 
//   $user->setGoogleId($google_id); 
//   //$user->setRoles('ROLE_USER'); 
//   //Set some wild random pass since its irrelevant, this is Google login 
//   $factory = $this->container->get('security.encoder_factory'); 
//   $encoder = $factory->getEncoder($user); 
//   $password = $encoder->encodePassword(md5(uniqid()), $user->getSalt()); 
//   $user->setPassword($password); 
// 
//   $em = $this->doctrine->getManager(); 
//   $em->persist($user); 
//   $em->flush(); 
     } else { 
      $user = $result[0]; /* return User */ 
     } 

     //set id 
     $this->session->set('id', $user->getId()); 

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

    public function supportsClass($class) { 
     return $class === 'Application\\Sonata\\UserBundle\\Entity\\User'; 
    } 

} 

사용하여 난 단지 로그인해야합니다. 새로운 사용자가 아니기 때문에 코드에서 무시했습니다.