2010-11-11 4 views
0

Je suis actuellement en train de construire une application en utilisant ZF et je veux intégrer Facebook Connect - avait quelques questions sur l'architecture.Architecture pour Zend Framework + Facebook Connect

Fonctionnalité: Toutes les connexions passent par FB connect, il n'y a pas d'autre formulaire de connexion. Lorsqu'un utilisateur clique pour la première fois sur "Connecter", l'application doit créer une entrée dans la base de données pour lier des données supplémentaires (avis, profil, etc.). L'en-tête doit avoir un bouton 'Connexion avec FB Connect' sur toutes les pages si l'utilisateur n'est pas connecté, et un message de bienvenue/image/profil terminé bar% si c'est le cas.

architecture Pour autant que je peux voir, il y a deux éléments - un appel JS qui gère la connexion, redirection et écriture des cookies (fb: login-button) et un peu de PHP qui lit le cookie. Je suis un peu confus au sujet de ce qui devrait aller où. Le bouton de connexion est via JS, donc je l'ai chargé dans ma layout.phtml et j'ai géré le contrôle des cookies via un View Helper - l'assistant récupère le cookie et le renvoie à la vue. C'est bien, mais je dois gérer des choses comme vérifier si l'utilisateur existe et ajouter de nouveaux utilisateurs à la base de données - cela ne semble pas être quelque chose qui appartient à un assistant. Je l'ai refacturé pour inclure le cookie PHP dans le contrôleur d'utilisateur, mais j'ai besoin du cookie dans la vue, qui est rendue par un contrôleur différent. J'ai appelé une aide d'action de vue, mais cela semble être plus pour renvoyer des pages partielles, et je ne peux pas obtenir la variable de tableau de cookie hors de lui. Je suis assez nouveau à MVC, et il me semble qu'il me manque quelque chose d'assez évident - des pensées?

code est juste à côté du site des développeurs FB:

class Zend_View_Helper_FacebookCookie extends Zend_View_Helper_Abstract 
    { 
     public function facebookCookie() 
     { 
      $FACEBOOK_APP_ID = 'xxx'; 
      $FACEBOOK_SECRET = 'xxx'; 
      $cookie = $this->getFacebookCookie($FACEBOOK_APP_ID, $FACEBOOK_SECRET); 
      //Zend_Debug::dump($cookie); 
      return $cookie; 
     } 




     public function getFacebookCookie($app_id, $application_secret) 
     { 
      $args = array(); 
      parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
      ksort($args); 
      $payload = ''; 
      foreach ($args as $key => $value) { 
       if ($key != 'sig') { 
       $payload .= $key . '=' . $value; 
       } 
      } 
      if (md5($payload . $application_secret) != $args['sig']) { 
       return null; 
      } 
      return $args; 
     } 
    } 

et dans la vue:

if ($cookie) { ?> 
    Your user ID is <?= $cookie['uid'] ?> 
<?php } else { ?> 
    <fb:login-button></fb:login-button> 
<?php } ?> 
+0

Quelle est la question? – Gordon

+0

Je ne peux pas comprendre comment structurer cela, et où placer chaque fragment de code - devraient-ils être des aides, ou mettre dans le contrôleur? Comment puis-je obtenir le cookie dans la vue pour voir si l'utilisateur est connecté? – localtalent

Répondre

0

La façon dont je l'ai mis en œuvre dans le passé est via un seul plugin preDispatch - il vérifie le statut de l'utilisateur avec l'API Facebook, puis modifie leur état local (c'est-à-dire connecté/non connecté) et stocke cet état en utilisant Zend_Auth et/ou Zend_Session.

Si l'utilisateur est authentifié avec Facebook mais pas encore dans votre base de données, le plugin preDispatch crée l'enregistrement dans votre base de données avant de définir son état local.

Ensuite, vous pouvez interroger Zend_Auth ultérieurement dans l'application afin de déterminer si l'utilisateur L'avantage est ici est connecté.

que si vous implémentez les autres mécanismes d'authentification (OpenID ou autres), vous pouvez simplement créer un autre plugin Pour ce faire, vous n'avez pas besoin de modifier le reste de votre compte, l'utilisateur est finalement authentifié localement par Zend_Auth).