1

我使用这种方法安装了 FOSUserBundle 和 FOSFacebookBundle:How to make a separate url for signin via Facebook using FOSFacebookBundle in Symfony2。实际上我并没有真正理解整个安全过程,但它现在工作正常。

当有人使用 facebook 注册时,我希望在注册之前选择一个用户名(而不是 facebook id 作为用户名)......我所做的是我向 facebook 登录路由发送一个 POST 参数,但我可以' t 找到正在处理注册的控制器。

最佳做法是什么?我应该在哪里检索用户名(POST 参数)并设置它?

这是我在 security.yml 中的配置:

firewalls:

public:
  pattern: ^/

  fos_facebook:
    app_url: "http://www.appName.com"
    server_url: "http://local.appName.com/app_dev.php/"
    login_path: /login
    check_path: /login_check/facebook
    provider: appName.facebook.provider

  form_login:
    login_path: /login
    check_path: /login_check/form
    provider: fos_userbundle
    csrf_provider: form.csrf_provider  

这是我用来注册 facebook 的路由:

_security_check_facebook:
    pattern: /login_check/facebook
4

3 回答 3

2

没有控制器处理身份验证,任何身份验证方法都会添加一个将在 check_path 上触发的侦听器,然后就可以了。

身份验证过程不应该负责添加自定义用户数据。如果您遵循 FOSFacebookBundle 文档,您应该有一个将用户存储在数据库中的自定义用户提供程序,这可能会有点混淆,但这不是注册步骤,而是身份验证步骤。添加用户名与配置文件编辑非常相似。

为了帮助你,我应该看到你的实现(你如何发送 post 参数?)但你可以尝试这样的事情:

  1. 将 post 参数发送到自定义控制器(由您实现)
  2. 临时存储用户名(可能是用户会话数据?)
  3. 触发身份验证过程(这取决于您的实现,但本质上我们是在谈论在 facebook 上进行身份验证,然后发布到 login_check 路径)
  4. 在经过身份验证的用户处添加用户名

这可以工作,但我从来没有做过这样的事情。

于 2012-03-15T21:16:36.403 回答
1

老问题,但我正在研究类似的问题。我想在用户第一次连接 Facebook 时为他们添加一个角色。

如果您遵循 FOSFacebookBundle 文档中的这些步骤,那么您可以点击 Facebook 连接用户的“注册”,查看FacebookProvider课程。

loadUserByUsername方法中有这部分:

if (!empty($fbdata)) {
    if (empty($user)) {
        $user = $this->userManager->createUser();
        $user->setEnabled(true);
        $user->setPassword('');
    }

    $user->setFBData($fbdata);
    ...

setPasswordif 之后是我为我的用户添加角色的地方。

对于您选择用户名的原始问题...注意调用setFBData?

在 User 实体中,该方法如下所示:

public function setFBData($fbdata)
{
    if (isset($fbdata['id'])) {
        $this->setFacebookId($fbdata['id']);
        $this->addRole('ROLE_FACEBOOK');
    }
    if (isset($fbdata['first_name'])) {
        $this->setFirstname($fbdata['first_name']);
    }
    if (isset($fbdata['last_name'])) {
        $this->setLastname($fbdata['last_name']);
    }
    if (isset($fbdata['email'])) {
        $this->setEmail($fbdata['email']);
    }
}

setFacebookId()看起来像这样:

public function setFacebookId($facebookId)
{
    $this->facebookId = $facebookId;
    $this->setUsername($facebookId);
}

这就是用户名的来源。我想这是一个流程,您可以将您选择的用户名插入并设置它而不是$facebookId.

于 2013-10-08T11:28:41.227 回答
1

我为此做了另一种方法。我使用了 GraphAPI。

public function setFacebookId($facebookId)
{
    $this->facebookId = $facebookId;
    $username = json_decode(file_get_contents('http://graph.facebook.com/'.$this->facebookId))->username;
    $this->setUsername($username);
}

它需要 Facebook 用户名,一个独特的用户名。

于 2014-05-16T00:14:28.967 回答