FOSFacebookBundle: Выберите имя пользователя перед регистрацией - PullRequest
1 голос
/ 27 февраля 2012

Я установил FOSUserBundle и FOSFacebookBundle, используя этот метод: Как создать отдельный URL для входа через Facebook с помощью FOSFacebookBundle в Symfony2 .На самом деле я не совсем понял весь процесс обеспечения безопасности, но сейчас он работает нормально.

Когда кто-то использует регистрацию в Facebook, я хотел бы иметь возможность выбрать имя пользователя до регистрации (вместо Facebookid как имя пользователя) ... что я делаю, так это отправляю параметр 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

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Нет проверки подлинности обработки контроллера, когда-либо метод проверки подлинности добавляет прослушиватель, который сработает на check_path, и делает свое дело.

Процесс аутентификации не должен отвечать за добавление пользовательских данных. Если вы следовали документации FOSFacebookBundle, у вас должен быть пользовательский провайдер, который хранит пользователя в базе данных, это может немного сбить с толку, но это не шаг регистрация , это шаг аутентификация . Добавление имени пользователя очень похоже на редактирование профиля.

Чтобы помочь вам, я должен увидеть вашу реализацию (как вы отправляете параметр post?), Но вы можете попробовать что-то вроде этого:

  1. отправить параметр post на пользовательский контроллер (реализованный вами)
  2. имя пользователя временного хранилища (может быть, данные сеанса пользователя?)
  3. инициировать процесс аутентификации (это зависит от вашей реализации, но, по сути, мы говорим о аутентификации на Facebook, а затем публикуем по пути login_check)
  4. добавить имя пользователя для аутентифицированного пользователя

Это может сработать, но я никогда не делал ничего подобного.

1 голос
/ 16 мая 2014

Я сделал другой способ для этого. Я использовал 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.

1 голос
/ 08 октября 2013

Старый вопрос, но я работал над аналогичной проблемой.Я хотел добавить роль пользователю, когда он был зарегистрирован при первом подключении к Facebook.

Если вы подписаны на эти шаги из документации FOSFacebookBundle, то вы можете нажать наFacebook подключил пользователя "регистрация", взгляните на класс FacebookProvider.

В методе loadUserByUsername есть эта часть:

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

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

После setPassword в пределах ifвот где я добавил роль для своего пользователя.

Для вашей первоначальной проблемы выбора имени пользователя ... обратите внимание, что вызов 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.

...