*** Je déplace le sujet ***
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 !)
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>