Changeset 51896 in spip-zone


Ignore:
Timestamp:
Sep 26, 2011, 8:48:07 PM (8 years ago)
Author:
rastapopoulos@…
Message:

Allez on repart :

  • dernière librairie PHP de connexion Facebook et on appelle la lib sans l'inclure
  • nécessite Bonux pour pouvoir configurer proprement les identifiants de l'application (plus besoin quand on passera à SPIP 3)
  • intégration pour l'instant dans le formulaire d'inscription de manière propre : on ajoute un bouton (moche pour l'instant) "S'inscrire avec Facebook" => ça part chez eux pour se connecter et acquérir les bonnes autorisations => ça revient sur la page d'où on était parti et ça pré-rempli les champs du formulaire

Le mécanisme d'authentification marche donc bien mais n'est pour l'instant utilisé que dans le formulaire d'inscription.

Reste à :

  • enregistrer l'UID Facebook à l'inscription (dans le pipeline traiter()) quand on en trouve un
  • ajouter la même authentification (les fonctions marchent déjà) mais dans le formulaire de login cette fois
Location:
_plugins_/fblogin/dev
Files:
9 added
1 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fblogin/dev/base/fblogin.php

    r44215 r51896  
    4545        sql_alter('table spip_auteurs drop fb_uid');
    4646        effacer_meta($nom_meta_base_version);
     47        // Effacer la configuration
     48        effacer_meta('fblogin');
    4749}
    4850
  • _plugins_/fblogin/dev/fblogin_pipelines.php

    r44215 r51896  
    11<?php
     2
     3// Sécurité
     4if (!defined('_ECRIRE_INC_VERSION')) return;
     5
    26/**
    3  * Plugin fblogin
    4  * Licence GPL (c) 2007-2009 Edouard Lafargue, Mathieu Marcillaud, Cedric Morin, Fil
     7 * Afficher le choix Facebook dans le formulaire d'inscription
    58 *
     9 * @param <type> $flux
     10 * @return <type>
    611 */
     12function fblogin_recuperer_fond($flux) {
     13        if ($flux['args']['fond'] == 'formulaires/inscription'){
     14                $fblogin = recuperer_fond('formulaires/inc-inscription-fblogin',$flux['data']['contexte']);
     15                // Le premier <ul trouvé
     16                $flux['data']['texte'] = preg_replace('/<ul/i', $fblogin.'<ul', $flux['data']['texte'], 1);
     17        }
     18        return $flux;
     19}
    720
     21/*
     22 * Précharge des valeurs si on est dans le cas Facebook
     23 */
     24function fblogin_formulaire_charger($flux){
     25        if ($flux['args']['form'] == 'inscription' and $fb_uid = _request('fb_uid')){
     26                $flux['data']['fb_uid'] = $fb_uid;
     27                $flux['data']['nom_inscription'] = _request('nom_inscription');
     28                $flux['data']['mail_inscription'] = _request('mail_inscription');
     29                if ($erreur = _request('var_erreur')){
     30                        $flux['data']['message_erreur'] = _request('var_erreur');
     31                }
     32        }
     33       
     34        return $flux;
     35}
    836
    9 
    10 
    11 
    12 
     37/*
     38 * Vérifie si on veut s'inscrire avec Facebook et demande alors l'authentification là-bas
     39 */
     40function fblogin_formulaire_verifier($flux){
     41        if ($flux['args']['form'] == 'inscription' and _request('fblogin')){
     42                include_spip('inc/fblogin');
     43                // On ajoute une erreur à tout hasard, pour pas que ça parte dans le traitement
     44                $flux['data']['fblogin'] = true;
     45                // On redirige vers l'authentification Facebook
     46                // et on récupère des informations au retour
     47                $retour = fblogin_url_retour_inscription(self());
     48                // Lancer l'identification chez Facebook
     49                $erreur = fblogin_demander_authentification($retour);
     50                // Si on arrive ici c'est une ERREUR
     51                $flux['data']['message_erreur'] = $erreur;
     52        }
     53       
     54        return $flux;
     55}
    1356
    1457/**
  • _plugins_/fblogin/dev/inc/fblogin.php

    r44690 r51896  
    11<?php
     2
     3// Sécurité
     4if (!defined('_ECRIRE_INC_VERSION')) return;
     5
     6/*
     7 * Charge le client PHP pour dialoguer avec l'API Facebook
     8 *
     9 * @return Retourne une instance de la classe du client Facebook
     10 */
     11function fblogin_charger_client(){
     12        static $client = NULL;
     13       
     14        if (is_null($client)){
     15                // Inclure la librairie Facebook
     16                include_spip('lib/facebook-php-sdk-9513f08/src/facebook');
     17                // Inclure la librairie de configuration
     18                include_spip('inc/config');
     19               
     20                if ($app_id = lire_config('fblogin/app_id') and $secret_key = lire_config('fblogin/secret_key')){
     21                        $parametres = array(
     22                                'appId'  => $app_id,
     23                                'secret' => $secret_key,
     24                                'cookie' => true,
     25                        );
     26               
     27                        $client = new Facebook($parametres);
     28               
     29                        // Problèmes avec SSL
     30                        Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false;
     31                        Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2;
     32                }
     33        }
     34       
     35        return $client;
     36}
     37
     38/*
     39 * Générer une URL de retour après authentification
     40 *
     41 * @param string $redirect L'URL sur laquelle revenir tout à la fin
     42 * @return string Retourne une URL d'action pour finaliser l'authentification
     43 */
     44function fblogin_url_retour_inscription($redirect=''){
     45        $securiser_action = charger_fonction('securiser_action','inc');
     46        return $securiser_action('inscrire_fblogin', '', $redirect, true);
     47}
     48
     49/*
     50 * Partir chez Facebook pour s'authentifier puis revenir
     51 *
     52 * Lancer une demande d'auth par Facebook
     53 * consiste à rediriger vers le serveur Facebook
     54 * qui renverra sur l'url $retour apres identification
     55 *
     56 * Si tout se passe bien, la fonction quitte par une redirection+exit
     57 * En cas d'echec, la fonction renvoie une erreur
     58 *
     59 * @param string $retour URL de retour
     60 * @return string
     61 */
     62function fblogin_demander_authentification($retour){
     63        if ($facebook = fblogin_charger_client()){
     64                // User ID
     65                $user = $facebook->getUser();
     66       
     67                // S'il y a un utilisateur reconnu, c'est que peut-être le visiteur est connecté à Facebook
     68                // Mais pas sûr à 100% car le jeton peut être périmé, donc on try{}
     69                if ($user) {
     70                        try {
     71                                // Est-ce que le visiteur est vraiment connecté ? Si oui on récupère son profil
     72                                $profil = $facebook->api('/me');
     73                        } catch (FacebookApiException $e) {
     74                                spip_log($e->getMessage(), 'fblogin');
     75                                $user = $profil = null;
     76                        }
     77                }
     78       
     79                // Maintenant on peut être sûr de savoir s'il y a vraiment une connexion ou pas
     80                // Pour que ce soit bon il faut au moins l'email
     81                include_spip('inc/headers');
     82                if ($user and $profil['email']) {
     83                        echo '<div class="formulaire_spip">'
     84                        . redirige_formulaire($retour)
     85                        . '</div>';
     86                        exit;
     87                }
     88                // Si c'est pas bon il faut aller se connecter en demandant les bonnes autorisations
     89                else{
     90                        // Les autorisations passent dans un pipeline pour pouvoir en ajouter suivant les besoins
     91                        $autorisations = pipeline(
     92                                'fblogin_autorisations',
     93                                'email'
     94                        );
     95                       
     96                        $url_login = $facebook->getLoginUrl(array(
     97                                'redirect_uri' => $retour,
     98                                'scope' =>      $autorisations,
     99                        ));
     100               
     101                        echo '<div class="formulaire_spip">'
     102                        . redirige_formulaire($url_login)
     103                        . '</div>';
     104                        exit;
     105                }
     106        }
     107        else{
     108                return _T('fblogin:erreur_client');
     109        }
     110}
     111
    2112/**
    3  * Plugin fblogin
    4  * Licence GPL (c) 2007-2010 Edouard Lafargue, Mathieu Marcillaud, Cedric Morin, Fil
    5  *
    6  */
    7 
    8 @define('_fblogin_LOG', true);
     113 * Finir l'authentification apres le retour depuis le serveur Facebook
     114 * analyse le retour de la requete openID
     115 * utilise l'URL de retour pour vérifier la demande
     116 * renvoie une chaîne d'erreur en cas d'erreur
     117 * un tableau decrivant l'utilisateur en cas de succès
     118 *
     119 * @param string $retour
     120 * @return mixed
     121 */
     122function fblogin_terminer_authentification(){
     123         if ($facebook = fblogin_charger_client()){
     124                // User ID
     125                $user = $facebook->getUser();
     126               
     127                // S'il y a un utilisateur reconnu, c'est que peut-être le visiteur est connecté à Facebook
     128                // Mais pas sûr à 100% car le jeton peut être périmé, donc on try{}
     129                if ($user) {
     130                        try {
     131                                // Est-ce que le visiteur est vraiment connecté ? Si oui on récupère son profil
     132                                $profil = $facebook->api('/me');
     133                        } catch (FacebookApiException $e) {
     134                                spip_log($e->getMessage(), 'fblogin');
     135                                $user = $profil = null;
     136                        }
     137                }
     138               
     139                // Maintenant on sait si connecté ou pas
     140                if ($user and $fb_uid = $profil['id'] and $email = $profil['email']){
     141                        $identite = array();
     142                        // Celui de FB sinon le login de l'email
     143                        $identite['login'] = isset($profil['nickname']) ? $profil['nickname'] : reset(explode('@', $email));
     144                        $identite['email'] = $email;
     145                        $identite['nom'] = isset($profil['name']) ? $profil['name'] : $identite['login'];
     146                        $identite['fb_uid'] = $fb_uid;
     147                        $identite = pipeline(
     148                                'fblogin_recuperer_identite',
     149                                array(
     150                                        'args' => $profil,
     151                                        'data' => $identite
     152                                )
     153                        );
     154                        return $identite;
     155                }
     156                // Sinon on cherche une erreur
     157                else{
     158                        if ($error = _request('error')){
     159                                return _request('error_description');
     160                        }
     161                }
     162        }
     163        else{
     164                return _T('fblogin:erreur_client');
     165        }
     166}
    9167
    10168/**
     
    44202}
    45203
    46 
    47 
    48 
    49 /**
    50  * Logs pour fblogin, avec plusieurs niveaux pour le debug (1 a 3)
    51  *
    52  * @param mixed $data : contenu du log
    53  * @param int(1) $niveau : niveau de complexite du log
    54  * @return null
    55 **/
    56 function fblogin_log($data, $niveau=1){
    57         if (!defined('_fblogin_LOG') OR _fblogin_LOG < $niveau) return;
    58         spip_log('fblogin: '.$data, 'fblogin');
    59 }
    60 
    61 
    62 
    63 
    64204?>
  • _plugins_/fblogin/dev/lang/fblogin_fr.php

    r50556 r51896  
    55
    66$GLOBALS[$GLOBALS['idx_lang']] = array(
    7 
     7        // C
     8        'config_menu' => 'Connexion Facebook',
     9        'config_app_id_label' => 'Identifiant de l\'application',
     10        'config_secret_key_label' => 'Clé secrète',
     11        'config_titre' => 'Configurer la connexion Facebook',
     12       
    813        // E
     14        'erreur_client' => 'Impossible de se connecter à Facebook. Contacter le webmestre pour vérifier la configuration du site.',
    915        'erreur_fblogin' => 'Cette adresse fblogin ne semble pas valide',
    1016        'erreur_librairies' => 'Impossible de trouver les librairies d\'authenfication fblogin',
     
    1218       
    1319        // F
     20        'form_inscription_facebook' => 'S\'inscrire avec Facebook',
    1421        'form_login_fblogin' => 'Vous pouvez aussi utiliser un identifiant fblogin (<a href="http://www.fbloginfrance.fr/" target="_blank" rel="external">aide</a>)',
    1522        'form_forum_indiquer_fblogin' => 'Vous pouvez vous inscrire sur ce site en indiquant un identifiant fblogin.',
  • _plugins_/fblogin/dev/plugin.xml

    r50556 r51896  
    1313                </multi>
    1414        </licence>
    15         <version>0.1</version>
     15        <version>0.2.0</version>
    1616        <version_base>0.1</version_base>
    1717        <etat>dev</etat>
     
    3434        </pipeline>
    3535        <pipeline>
    36                 <nom>afficher_contenu_objet</nom>
    37                 <inclure>fblogin_pipelines.php</inclure>
    38         </pipeline>
    39         <pipeline>
    40                 <nom>editer_contenu_objet</nom>
     36                <nom>recuperer_fond</nom>
    4137                <inclure>fblogin_pipelines.php</inclure>
    4238        </pipeline>
     
    4945                <inclure>fblogin_pipelines.php</inclure>
    5046        </pipeline>
    51         <pipeline>
    52                 <nom>formulaire_traiter</nom>
    53                 <inclure>fblogin_pipelines.php</inclure>
    54         </pipeline>
    55         <pipeline>
    56                 <nom>pre_edition</nom>
    57                 <inclure>fblogin_pipelines.php</inclure>
    58         </pipeline>
    59         <pipeline>
    60                 <nom>recuperer_fond</nom>
    61                 <inclure>fblogin_pipelines.php</inclure>
    62         </pipeline>
    63         <pipeline>
    64                 <nom>social_login_links</nom>
    65                 <inclure>fblogin_pipelines.php</inclure>
    66         </pipeline>
    67         <pipeline>
    68                 <nom>social_inscription_links</nom>
    69                 <inclure>fblogin_pipelines.php</inclure>
    70         </pipeline>
    7147        <categorie>auteur</categorie>
     48       
     49        <necessite id="lib:facebook-php-sdk-9513f08" src="https://github.com/facebook/php-sdk/zipball/v3.1.1" />
     50        <necessite id="spip_bonux" version="[2.2.22;]" />
    7251</plugin>
Note: See TracChangeset for help on using the changeset viewer.