Utiliser Paheko comme SSO
Actuellement (avril 2024) Paheko ne fournit pas de fonctionnalité permettant de l'utiliser comme Identity Provider : que d'autres applications puissent faire authentifier leurs utilisateurs via Paheko.
Cependant il existe un exemple de serveur LDAP basé sur Paheko, écrit pour la version 1.1. Des modifications sont peut-être nécessaires pour que ça fonctionne avec la version 1.3+.
D'autres solutions envisageables seraient :
- créer un backend pour GLAuth (serveur LDAP) qui utiliserait la base de données Paheko.
- créer un plugin pour Paheko supportant OpenID Connect par exemple, comme pour NextCloud. Un ticket a été créé à ce sujet.
- créer un plugin pour un serveur SAML qui fasse appel à la base de données Paheko. Une solution semblable existe pour NextCloud.
Aucune de ces solutions n'est développée à l'heure actuelle.
Synchro avec fichier statique GLAuth (serveur LDAP)
Une solution simple est d'exporter régulièrement les infos des membres dans un fichier statique de GLAuth.
Par exemple avec cette crontab :
* * * * * php sync_glauth.php /var/www/paheko/data/association.sqlite /etc/glauth/glauth.cfg && systemctl reload glauth
Et ce script sync_glauth.php :
<?php
$db = $_SERVER['argv'][1] ?? null;
$cfg = $_SERVER['argv'][2] ?? null;
if (!$db || !$cfg) {
echo "Usage: sync_glauth.php PAHEKO_DATABASE_FILE GLAUTH_CONFIG_FILE\n";
exit(1);
}
$db = new SQLite3($db, SQLITE3_OPEN_READONLY);
// Fetch login field name
$login_field = $db->querySingle('SELECT name FROM config_users_fields WHERE system & (0x01 << 2);');
$sql = sprintf('SELECT u.id, u.%s AS login, u.otp_secret, hex(u.password) AS password
FROM users u
INNER JOIN users_categories c ON c.id = u.id_category
WHERE u.password IS NOT NULL
AND c.perm_connect > 0;',
$login_field);
$result = $db->query($sql);
$out = '
[backend]
datastore = "config"
baseDN = "ou=users,dc=yunohost,dc=org"
[[groups]]
name = "all_users"
gidnumber = 10000
';
while ($user = $result->fetchArray(SQLITE3_ASSOC)) {
$user = (object) $user;
$out .= sprintf('
[[users]]
name = "%s"
uidnumber = %d
primarygroup = 10000
passappbcrypt = "%s"
',
str_replace('"', '', $user->login),
10000 + $user->id,
$user->password,
$user->otp_secret
);
}
$db->close();
if (md5($out) !== @md5_file($cfg)) {
// File was modified, return 0 to reload server
file_put_contents($cfg, $out);
exit(0);
}
// Nothing has changed
exit(2);
Il est ensuite possible d'utiliser un IDP comme Authelia par dessus GLAuth.