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 :

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.