如何将Sonata用户软件包与HWIOAuthBundle集成。在HWIOAuthBundle,文档是FOSUserBundle。但是在NET中没有SonataUserBundle的文档。我用网络搜索,一无所获。
根据我创建的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;
}
我的提供者类(来自网络)
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';
但仍然出错。
根据奏鸣曲用户实体
更新01:
在Application \ Sonata \ UserBundle \ Entity \ User
我改变了$facebookID
(及其所有相关的......)。然后我收到错误invalid password.
答案 0 :(得分:1)
我从这个位置得到了回答。它只适用于谷歌但我也加入了Facebook。使用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';
}
}
我只需要登录。不是新用户注册,这就是我在代码中忽略的原因。