source: spip-zone/_plugins_/fblogin/dev/inc/fblogin.php @ 52098

Last change on this file since 52098 was 52098, checked in by rastapopoulos@…, 8 years ago

Le pré-remplissage des infos marchait bien, maintenant l'enregistrement de l'UID aussi, après vérification que le mail d'inscription et le mail FB soit bien le même.

File size: 5.6 KB
Line 
1<?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
112/**
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 * @return mixed
120 */
121function fblogin_terminer_authentification(){
122         if ($facebook = fblogin_charger_client()){
123                // User ID
124                $user = $facebook->getUser();
125               
126                // S'il y a un utilisateur reconnu, c'est que peut-être le visiteur est connecté à Facebook
127                // Mais pas sûr à 100% car le jeton peut être périmé, donc on try{}
128                if ($user) {
129                        try {
130                                // Est-ce que le visiteur est vraiment connecté ? Si oui on récupère son profil
131                                $profil = $facebook->api('/me');
132                        } catch (FacebookApiException $e) {
133                                spip_log($e->getMessage(), 'fblogin');
134                                $user = $profil = null;
135                        }
136                }
137               
138                // Maintenant on sait si connecté ou pas
139                if ($user and $fb_uid = $profil['id'] and $email = $profil['email']){
140                        $identite = array();
141                        // Celui de FB sinon le login de l'email
142                        $identite['login'] = isset($profil['nickname']) ? $profil['nickname'] : reset(explode('@', $email));
143                        $identite['email'] = $email;
144                        $identite['nom'] = isset($profil['name']) ? $profil['name'] : $identite['login'];
145                        $identite['fb_uid'] = $fb_uid;
146                        // Un pipeline pour ajouter des informations en plus de celles de base, à partir du profil récupéré
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}
167
168/**
169 * Ajout au formulaire de login
170 *
171 * @param string $texte
172 * @param array $contexte
173 * @return string
174 */
175function fblogin_login_form($texte,$contexte){
176
177$scriptfblogin = "";
178
179        $texte .= "<div id='fb-root'></div>
180      <script src='http://connect.facebook.net/fr_FR/all.js'>
181      </script>
182      <script>
183      window.fbAsyncInit = function() {
184         FB.init({
185            appId:'_FB_APP_ID', cookie:true,
186            status:true, xfbml:true
187         });
188        // whenever the user logs in, we refresh the page
189        FB.Event.subscribe('auth.login', function() {
190          window.location.reload();
191        });
192      }
193      </script>
194      <fb:login-button perms='email' onlogin='FB_JS.reload();'>
195         Login with Facebook
196      </fb:login-button>";
197     
198     
199        return $texte;
200
201       
202}
203
204?>
Note: See TracBrowser for help on using the repository browser.