Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于facebook登录用户自动注册新用户_Php_Facebook_Facebook Graph Api_Symfony_Fosuserbundle - Fatal编程技术网

Php 基于facebook登录用户自动注册新用户

Php 基于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

我正在尝试使用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()
,这是我按照您之前给出的链接中的说明创建的,并将其保存到我的数据库中。谢谢你的指导。