Question

J'ai installé FosuserBundle et FosfaceBookBundle en utilisant cette méthode: Comment créer une URL séparée pour Signin via Facebook à l'aide de FosfaceBookBundle dans Symfony2. En fait, je n'ai pas vraiment compris tout le processus de sécurité, mais cela fonctionne bien maintenant.

Lorsque quelqu'un utilise l'inscription Facebook, je voudrais la possibilité de choisir un nom d'utilisateur avant d'être enregistré (au lieu de l'ID Facebook comme nom d'utilisateur) ... ce que je fais, c'est que j'envoie un paramètre de publication à la route de connexion Facebook mais je peux ' T Trouvez le contrôleur où l'enregistrement est en cours de traitement.

Quelle serait la meilleure pratique? Où dois-je récupérer le nom d'utilisateur (le post param) et le définir?

Voici ma configuration dans 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  

Et voici le routage que j'utilise pour m'inscrire avec Facebook:

_security_check_facebook:
    pattern: /login_check/facebook
Était-ce utile?

La solution

Il n'y a pas d'authentification de traitement du contrôleur, de la méthode d'authentification jamais ajouter un écouteur qui déclenchera sur Check_Path et fera l'affaire.

Le processus d'authentification ne devrait pas être responsable d'ajouter des données utilisateur personnalisées. Si vous avez suivi la documentation FosfaceBookBundle, vous devriez avoir un fournisseur d'utilisateurs personnalisé qui stockent l'utilisateur sur la base de données, cela peut confondre un peu mais ce n'est pas un enregistrement étape, est un authentification marcher. L'ajout d'un nom d'utilisateur est beaucoup similaire à un édition de profil.

Pour vous aider, je devrais voir votre implémentation (comment envoyez-vous le paramètre de publication?) Mais vous pouvez essayer quelque chose comme ceci:

  1. Envoyez le paramètre Post à un contrôleur personnalisé (implémenté par vous)
  2. Nom d'utilisateur de magasin temporaire (peut-être les données de session utilisateur?)
  3. déclencher le processus d'authentification (cela dépend de votre implémentation, mais nous parlons essentiellement d'authentification sur Facebook, puis de publier sur le chemin Login_check)
  4. Ajouter le nom d'utilisateur à l'utilisateur authentifié

Cela pourrait fonctionner, mais je n'ai jamais fait quelque chose comme ça.

Autres conseils

Vieille question, mais je travaillais sur un problème similaire. Je voulais ajouter un rôle à un utilisateur lorsqu'ils ont été enregistrés la première fois qu'ils se sont connectés avec Facebook.

Si vous suive ces Étapes de la documentation FosfaceBookBundle, puis vous pouvez puiser dans "l'inscription" de l'utilisateur connecté à Facebook, jetez un œil à la FacebookProvider classer.

Dans loadUserByUsername Méthode Il y a cette partie:

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

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

Après le setPassword Dans le IF, j'ai ajouté le rôle de mon utilisateur.

Pour votre problème d'origine de choix du nom d'utilisateur ... Remarquez cet appel à setFBData?

Dans l'entité utilisateur, la méthode ressemble à ceci:

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']);
    }
}

et setFacebookId() ressemble à ça:

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

C'est donc d'où vient le nom d'utilisateur. Je suppose que c'est un flux où vous pouvez brancher votre nom d'utilisateur choisi et le définir au lieu du $facebookId.

J'ai fait une autre façon pour cela. J'ai utilisé Graphapi.

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

Il prend le nom d'utilisateur Facebook, unique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top