我使用这种方法安装了FOSUserBundle和FOSFacebookBundle:How to make a separate url for signin via Facebook using FOSFacebookBundle in Symfony2。实际上我并不是真的了解整个安全事务过程,但它现在工作正常。
当有人使用facebook注册时,我希望有可能在注册之前选择一个用户名(而不是facebook id作为用户名)...我做的是我发送POST参数到facebook登录路线但是我找不到正在处理注册的控制器。
最佳做法是什么?我应该在哪里检索用户名(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
答案 0 :(得分:2)
没有控制器处理身份验证,任何身份验证方法都会添加一个将在check_path上触发的侦听器,并执行该操作。
身份验证过程不应负责添加自定义用户数据。如果您遵循FOSFacebookBundle文档,您应该有一个将用户存储在数据库中的自定义用户提供程序,这可能会有点混淆,但这不是注册步骤,是身份验证步骤。添加用户名与配置文件编辑非常相似。
为了帮助你,我应该看看你的实现(你如何发送post参数?)但你可以尝试这样的事情:
这可行,但我从未做过这样的事情。
答案 1 :(得分:1)
老问题,但我正在研究类似的问题。我想在第一次与Facebook关联时注册用户时添加一个角色。
如果你从FOSFacebookBundle文档中跟随these步骤,那么你可以点击Facebook连接用户的“注册”,看看FacebookProvider
类。
在loadUserByUsername
方法中有这一部分:
if (!empty($fbdata)) {
if (empty($user)) {
$user = $this->userManager->createUser();
$user->setEnabled(true);
$user->setPassword('');
}
$user->setFBData($fbdata);
...
在if中的setPassword
后,我为我的用户添加了角色。
有关选择用户名的原始问题...请注意拨打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
。
答案 2 :(得分: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用户名,这是一个独特的用户名。