FOSFacebookBundle: выберите имя пользователя перед регистрацией

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

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

person httpete    schedule 27.02.2012    source источник


Ответы (3)


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

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

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

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

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

person ftassi    schedule 15.03.2012
comment
Ладно, у меня получилось. :) Я создал собственный контроллер, сохранил имя пользователя в сеансе и получил его в своем FacebookProvider! Еще раз спасибо! - person httpete; 25.03.2012

Старый вопрос, но я работал над аналогичной проблемой. Я хотел добавить роль пользователю, когда он был зарегистрирован при первом подключении к 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.

person juuga    schedule 08.10.2013

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

person Gura    schedule 16.05.2014