Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] jAuth : authentification par certificat

Posted by antoine on 04/06/2008 00:50

Bonjour,

Je souhaiterais implémenter dans Jelix une authentification basée sur un certificat client x509 (authentification SSL).

J'ai déjà développer une petite fonction dans le module jAuth, j'ai donc quelques petites connaissances sur le fonctionnement du module. J'ai regardé un peu comment implémenter ce nouveau type d'authentification, mais j'aurais besoins de vos conseils/avis sur la meilleure façon de procéder.

Le principe :

  • L'authentification SSL à proprement parler est réalisée sur l'Apache (ou le serveur http, de façon générale), en activant le mod_ssl et avec la config qui va bien (certificat client requis, contrôle de la validité du certificat, ...). Dans la config du mod_ssl, on précise qu'on veut exporter les données du certificat client (ExportCertData) afin que ces infos soient disponibles dans le code php.
  • Dans Jelix, j'ai commencé à développer un controller spécifique pour l'authentification par certificat (nouveau controller dans jelix-modules/jauth/controllers à l'image de login.classic.php). Il suffit de préciser d'utiliser ce controller lors de l'authentification Jelix. Dans ce controller, je récupère la variable d'environnement créée par mod_ssl, je parse le certificat et récupère les infos. Il faut ensuite verifier que ce client est autorisé à accéder au contenu. Pour se faire, le principe est de trouver un utilisateur (dans une table de la base de donnée, par exemple) qui correspond au client, à partir d'une des infos du certificat (numéro de série ou common name par exemple, mais une info suffisamment unique pour identifier la personne).
  • Si on trouve l'utilisateur, alors le client est authentifié et on peut récupérer un record et le mettre en session. Sinon, l'authentification échoue.

Mes questions/soucis maintenant :

  • La classe jAuth ne correspond pas à ce type d'authentification : dans jAuth, on a une méthode login(login,password) mais comme décrit ci dessus, dans mon cas on n'authentifie pas avec un couple (login,password) mais avec une infos du certificat pour retrouver un profil. Est-ce que je dois écrire une nouvelle classe pour l'authentification ? étendre jAuth ? ajouter une méthode dans jAuth ?
  • L'interface jIAuthDriver ne correspond pas non plus tout à fait aux besoins de cette authentification. J'aurais besoin de nouvelle(s) méthode(s), et toutes les méthodes ne peuvent pas être implémentées (changePassword, par exemple).

Quel est votre avis sur la manière de faire ? il me semble que le mieux est d'ajouter les méthodes nécessaires dans jAuth et dans les drivers pour jAuth ? Qu'en pensez vous ?

Une dernière petite remarque : de par le principe décrit ci-dessus, il y a une contrainte forte pour utiliser ce type d'authentification : l'application Jelix DOIT être installée sur le serveur web qui effectue l'authentification SSL (pour accéder aux variables d'environnement). Ce qui n'est pas un souci dans le cas d'applications classiques, mais ceci peut être problématique dans une architecture plus complexe, avec un serveur http servant de reverse proxy entre le client et le serveur http hébérgeant l'application, avec un flux ssl entre le client et le reverse proxy (authentification sur le reverse proxy, donc) et un flux http entre le reverse proxy et le serveur http en backend. Ce genre d'architecture est assez courante dans des applications nécessitant un haut niveau de sécurité. Dans ce genre de cas, il y a également des solutions pour authentifier au niveau Jelix, en passant par des headers http ajoutés par le reverse proxy, par exemple...

  [Opened] Re: jAuth : authentification par certificat

Reply #1 Posted by laurentj on 04/06/2008 14:26

La classe jAuth ne correspond pas à ce type d'authentification : dans jAuth, on a une méthode login(login,password) mais comme décrit ci dessus, dans mon cas on n'authentifie pas avec un couple (login,password) mais avec une infos du certificat pour retrouver un profil.

Le paramètre s'appelle $password, mais rien ne t'empêche en fait de donner autre chose que $password. C'est au driver pour jAuth d'en faire ce qu'il veut. Donc à toi de te faire un driver pour jAuth, (à l'image du driver "db" actuel), qui fait ce qu'il a à faire avec ces infos de certificat.

Je dirais même qu'à la limite, pas besoin d'avoir un contrôleur spécifique. Dans ce driver, tu pourrais récupérer directement les infos du certificat. Donc l'appel à jAuth::login('login', '');

toutes les méthodes ne peuvent pas être implémentées (changePassword, par exemple).

là encore, qui t'empêche de permettre le changement du certificat par changePassword ?

Pour le reste, jAuth ne prétend pas être la solution d'authentification ultime. Il n'y a rien dans Jelix qui t'oblige à utiliser jAuth pour l'authentification. Maintenant faut voir, les patchs sont bienvenus pour améliorer jAuth. Son API n'est pas figée dans le temps. Elle sera d'ailleurs peut-être légèrement modifiée pour le support de système d'authentification genre OpenId.

 
Page
  1. Re: jAuth : authentification par certificat