Annonce

Écrire une réponse

Veuillez écrire votre message et l'envoyer

Cliquez dans la zone sombre de l'image pour envoyer votre message.

Retour

Résumé de la discussion (messages les plus récents en premier)

Gotcha
2012-07-03 18:33:48

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

22decembre
2012-07-03 18:28:34

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 !)

prose
2012-07-03 17:40:22

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>

Pied de page des forums

Propulsé par FluxBB

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