#1 2012-07-03 17:40:22

prose
Membre
2012-07-03
3

Plugin d'authentification Facebook

Ne sachant pas réaliser de plugin piwigo, j'ai modifié le code pour faire une authentification facebook grace à facebook connect en utilisant les sdk javascript et php.

Pour reconnaitre les utilisateurs facebook, je force le login à la valeur 'fb_'.uid_facebook.

Voici le code (les ajouts sont entre commentaires), si quelqu'un peut en faire un plugin (merci dans ce cas de me citer dans la liste des auteurs):

Dans la fonction getuserdata (dans le fichier include/functions_user.inc.php, se repérer avec if($use_cache)):

// Ajout : création du user facebook et remplacement du username par le nom Facebook
global $page;
require_once(PHPWG_ROOT_PATH."/facebook-php-sdk/facebook.php");

$facebook = new Facebook(array(
  'appId'  => 'xxxxxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxxxx',
  'fileUpload' => false,
));

if ($facebook->getUser()) {
  try {
    $conf['fbuser']=$facebook->api('/me');
    if (!strcmp('fb_'.$facebook->getUser(), $userdata['username'])) $userdata['username'] = $conf['fbuser']['name'];
    } catch (FacebookApiException $e) {
    array_push( $page['errors'], l10n($e) );
    }
  }
// Fin ajout

  if ($use_cache)
  {
    if (!isset($userdata['need_update'])
        or !is_bool($userdata['need_update'])
        or $userdata['need_update'] == true)
    {
      $userdata['cache_update_time'] = time();

      // Set need update are done
      $userdata['need_update'] = false;

      $userdata['forbidden_categories'] =
        calculate_permissions($userdata['id'], $userdata['status']);

      /* now we build the list of forbidden images (this list does not contain
      images that are not in at least an authorized category)*/
      $query = '
SELECT DISTINCT(id)
  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
  WHERE category_id NOT IN ('.$userdata['forbidden_categories'].')
    AND level>'.$userdata['level'];

// Ajout: remplacement de la requête pour autoriser les photos des amis facebook
if ($facebook->getUser()) {
  try {
    $conf['fbfriends']=$facebook->api('/me/friends');
    $query = 'SELECT DISTINCT(it.id)
         FROM '.IMAGES_TABLE.' it INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id INNER JOIN '. USERS_TABLE.' ut
         ON added_by=ut.id  WHERE category_id NOT IN ('.$userdata['forbidden_categories'].') AND level>'.$userdata['level'].'
         AND ut.username NOT IN ('.implode(',',array_map(function($value) { return '\'fb_'.$value['id'].'\''; }, $conf['fbfriends']['data'])).')';;
    } catch (FacebookApiException $e) {
    array_push( $page['errors'], l10n($e) );
    }
  }
// Fin ajout

Dans idenitification.php:

// Ajout: authentif Facebook
if (isset($conf['fbuser']['id'])) {
   $uid = get_userid('fb_'.$conf['fbuser']['id']);
   if ($uid) { // L'utilisateur existe on le connecte et on redirige sur la page d'accueil
   // Ajout des infos user si inexistantes et rechargement de la page
     $userdata = getuserdata($uid, false);
     if (!isset($userdata['status'])) create_user_infos($uid);
     log_user($uid, true);
     redirect(make_index_url());
     } else {  // L'utilisateur n'existe pas on le crée
     $_POST['user_email'] = $conf['fbuser']['email'];
     // Génération d'un mot de passe aléatoire
     $pass = base_convert(mt_rand(0x1D39D3E06400000, min(0x41C21CB8E0FFFFFF, mt_getrandmax())), 10, 36);
     $pass .= base_convert(mt_rand(0x1D39D3E06400000, min(0x41C21CB8E0FFFFFF, mt_getrandmax())), 10, 36);
     $page['errors'] = register_user('fb_'.$conf['fbuser']['id'], $pass, $conf['fbuser']['email'], true, $page['errors']);
     $redirect_to = isset($_POST['redirect']) ? urldecode($_POST['redirect']) : '';
     // Si la session ne s'est pas créée c'est qu'il y a une erreur de connexion à Facebook
     if (!isset($_COOKIE[session_name()])) array_push( $page['errors'], l10n('Facebook connecting error!') );
     }
   }

// fin Ajout

if (isset($_POST['login']))

Et enfin, le template menubar_identification.tpl (entre la div "root" et le tag <ul>):

    <div id="fb-root"></div>
        {literal}<script src="http://connect.facebook.net/fr_FR/all.js"></script>
    <script>
    window.fbAsyncInit = function() {
            FB.init({appId: {/literal}'xxxxxxxxxx'{literal}, status: true, cookie: true, xfbml: true});
        FB.Event.subscribe('auth.logout', function(response) { location.href = '?act=logout'; });
        FB.Event.subscribe('auth.login', function(response) { location.href = 'identification.php'; });
        FB.getLoginStatus(function(response) {
            if (response.session) {
                quickconnect.submit();
                document.getElementById("hello").innerHTML = "Test";
                }
            });
        };
        (function() {
            var e = document.createElement('script'); e.async = true;
            e.src = document.location.protocol + '//connect.facebook.net/fr_FR/all.js';
            document.getElementById('fb-root').appendChild(e);
            }());
    </script> {/literal}

    <p><fb:login-button perms="email,user_birthday,friends_about_me" onlogin="quickconnect.submit();" autologoutlink="true"></fb:login-button></p>
    <ul>

Hors ligne

#2 2012-07-03 18:28:34

22decembre
Membre
2012-06-21
62

Re: Plugin d'authentification Facebook

Deuxieme plugin d'auth... Il va falloir un trigger de login !

(pour rappel, j'essaye moi aussi de créer un plugin d'authentification avec ldap cette fois-ci !)

Hors ligne

#3 2012-07-03 18:33:48

Gotcha
Ex Equipe Piwigo
Pierrelatte (26)
2007-03-14
13331

Re: Plugin d'authentification Facebook

*** Je déplace le sujet ***


Ayez comme premier réflexe de consulter le wiki.
Ensuite, veuillez effectuer une recherche sur le forum avant de poser votre question.

LE FAIRE EST LE REVELATEUR DE L'ETRE

Hors ligne

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact