根据Facebook登录用户自动注册新用户

时间:2014-03-30 17:12:55

标签: php facebook facebook-graph-api symfony fosuserbundle

我尝试使用FOSOAuthBundle和FOSUserBundle将我的应用程序连接到Facebook。连接到Facebook时,它工作正常,连接到Facebook后,应用程序将重定向到由FOSUserBundle创建的注册表单,以创建已连接到Facebook的新用户。现在我希望我的应用程序在我的应用程序成功连接到Facebook后,根据facebook用户信息自动创建新用户,例如username = facebook username,email = facebook email等。怎么做?

以下是我的一些代码:

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

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 }

config.yml

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

1 个答案:

答案 0 :(得分:0)

您必须编写相当多的代码才能实现您的目标。看看这个包含问题解决方案的Gist,还有一个很好的解释:

https://gist.github.com/danvbe/4476697

修改

为了从支持它的OAuth资源所有者那里获取用户的电子邮件,您需要定义要获取的数据范围。例如,对于Facebook,它将是:

hwi_oauth:
    resource_owners:
        facebook:
            scope: "email"

您需要在资源所有者的文档下查看您可以在范围内请求的数据类型。对于Facebook,请参阅此页面:https://developers.facebook.com/docs/facebook-login/permissions#categories