Php 基于facebook登录用户自动注册新用户
我正在尝试使用FOSOAuthBundle和FOSUserBundle将我的应用程序连接到facebook。当连接到facebook时,它工作正常,连接到facebook后,该应用程序将重定向到注册FOSUserBundle创建的表单,以便创建已连接到facebook的新用户。现在,我希望我的应用程序在成功连接到facebook后,根据facebook用户信息(如用户名=facebook用户名、电子邮件=facebook电子邮件等)自动创建新用户。怎么做 以下是我的一些代码: User.phpPhp 基于facebook登录用户自动注册新用户,php,facebook,facebook-graph-api,symfony,fosuserbundle,Php,Facebook,Facebook Graph Api,Symfony,Fosuserbundle,我正在尝试使用FOSOAuthBundle和FOSUserBundle将我的应用程序连接到facebook。当连接到facebook时,它工作正常,连接到facebook后,该应用程序将重定向到注册FOSUserBundle创建的表单,以便创建已连接到facebook的新用户。现在,我希望我的应用程序在成功连接到facebook后,根据facebook用户信息(如用户名=facebook用户名、电子邮件=facebook电子邮件等)自动创建新用户。怎么做 以下是我的一些代码: User.php
namespace Wirata\MainBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="facebook_id", type="string", nullable=true)
*/
private $facebookID;
public function __construct()
{
parent::__construct();
// your own logic
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function setfacebookID($facebookID)
{
$this->facebookID = $facebookID;
return $this;
}
}
Security.yml
namespace Wirata\MainBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="facebook_id", type="string", nullable=true)
*/
private $facebookID;
public function __construct()
{
parent::__construct();
// your own logic
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function setfacebookID($facebookID)
{
$this->facebookID = $facebookID;
return $this;
}
}
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
...
providers:
fos_userbundle:
id: fos_user.user_provider.username
...
firewalls:
...
secure_area:
pattern: ^/
oauth:
failure_path: /connect
login_path: /connect
check_path: /connect
provider: fos_userbundle
resource_owners:
facebook: "/login/check-facebook"
oauth_user_provider:
service: hwi_oauth.user.provider.fosub_bridge
anonymous: true
logout:
path: /logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/connect, roles: IS_AUTHENTICATED_ANONYMOUSLY }
fos_user:
db_driver: orm
firewall_name: secure_area
user_class: Wirata\MainBundle\Entity\User
registration:
confirmation:
enabled: false
hwi_oauth:
firewall_name: secure_area
connect:
confirmation: true
#account_connector: hwi_oauth.user.provider.fosub_bridge
#registration_form_handler: hwi_oauth.registration.form.handler.fosub_bridge
#registration_form: fos_user.registration.form
resource_owners:
facebook:
type: facebook
client_id: 'xxxxxxx'
client_secret: 'xxxxxxxxxxxxxxxx'
scope: "email"
infos_url: 'https://graph.facebook.com/me?fields=username,name,picture.type(square)'
http_client:
verify_peer: false
fosub:
username_iterations: 30
properties:
facebook: facebookID
config.yml
namespace Wirata\MainBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="facebook_id", type="string", nullable=true)
*/
private $facebookID;
public function __construct()
{
parent::__construct();
// your own logic
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function setfacebookID($facebookID)
{
$this->facebookID = $facebookID;
return $this;
}
}
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
...
providers:
fos_userbundle:
id: fos_user.user_provider.username
...
firewalls:
...
secure_area:
pattern: ^/
oauth:
failure_path: /connect
login_path: /connect
check_path: /connect
provider: fos_userbundle
resource_owners:
facebook: "/login/check-facebook"
oauth_user_provider:
service: hwi_oauth.user.provider.fosub_bridge
anonymous: true
logout:
path: /logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/connect, roles: IS_AUTHENTICATED_ANONYMOUSLY }
fos_user:
db_driver: orm
firewall_name: secure_area
user_class: Wirata\MainBundle\Entity\User
registration:
confirmation:
enabled: false
hwi_oauth:
firewall_name: secure_area
connect:
confirmation: true
#account_connector: hwi_oauth.user.provider.fosub_bridge
#registration_form_handler: hwi_oauth.registration.form.handler.fosub_bridge
#registration_form: fos_user.registration.form
resource_owners:
facebook:
type: facebook
client_id: 'xxxxxxx'
client_secret: 'xxxxxxxxxxxxxxxx'
scope: "email"
infos_url: 'https://graph.facebook.com/me?fields=username,name,picture.type(square)'
http_client:
verify_peer: false
fosub:
username_iterations: 30
properties:
facebook: facebookID
您将不得不编写相当多的代码,以实现您所寻找的。查看以下要点,其中包含问题的解决方案,以及一个很好的解释: 编辑
namespace Wirata\MainBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="facebook_id", type="string", nullable=true)
*/
private $facebookID;
public function __construct()
{
parent::__construct();
// your own logic
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function setfacebookID($facebookID)
{
$this->facebookID = $facebookID;
return $this;
}
}
为了从支持它的OAuth资源所有者中的用户那里获取电子邮件,您需要定义要获取的数据的范围。例如,对于Facebook,它将是:
hwi_oauth:
resource_owners:
facebook:
scope: "email"
您需要在资源所有者的文档下查看,以查看您可以在范围中请求什么类型的数据。对于Facebook,请参阅此页面:我知道,您无法获取Facebook用户的电子邮件,但您可以使用以下其中一种方式:nickname@facebook.com / fbid@facebook.com对于通知…问题在哪里?这很有帮助。现在我可以自动创建一个新用户,但仍然有同样的问题。按照链接上的说明,我只得到了facebookID,仍然没有得到用户名和电子邮件。
$username
仅保存facebookID值。如何从facebook获取用户名和电子邮件值?编辑了我的答案。过来看!但是我在我的资源所有者中添加了范围:“email”
,我仍然没有收到电子邮件。你重新连接了帐户吗?您必须这样做才能刷新权限(删除您尝试连接的Facebook帐户中的授权应用程序,然后重试)。问题已解决。我只在我的FOSUBUserProvider.php中添加email=$response->getEmail()
和realname=$response->getRealName()
,这是我按照您之前给出的链接中的说明创建的,并将其保存到我的数据库中。谢谢你的指导。