Frankiz

De WikiBR
Révision datée du 26 novembre 2011 à 14:35 par Nicolas.iooss (discussion | contributions) (Réécriture du code d'authentification Frankiz)

Frankiz est le portail interne des élèves.

La version actuelle (3) a été lancée par le BR2k8 juste avant son départ du plateau. Elle est principalement destinée à pouvoir ouvrir l'utilisation de Frankiz aux écoles arrivant progressivement sur le plateau, et à devenir ainsi un portail de la vie associative du campus.

Le code de Frankiz3 est libre, et utilise git comme système de versionnement. Il est intégralement disponible à l'adresse suivante : http://git.frankiz.net/frankiz/

Développement

Les principaux projets de développement sont actuellement (juillet 2011) :

  • l'élargissement effectif aux autres écoles, en travaillant notamment sur :
    • la simplicité de création de nouveaux comptes, avec nomination de modérateurs dans chaque école
    • le cloisonnement des données et la possibilité de définir des champs de visibilité
  • la création de mini-forums qui remplaceraient à la fois les annonces et les newsgroups


Outils pour les développeurs

Authentification sur des sites externes

Frankiz permet à des sites externes (binets en particulier) d'utiliser sa base de données pour authentifier les utilisateurs.

Le webmaster du site en question doit auparavant faire une demande de mise en place de ce système en envoyant un mail à l'équipe frankiz (frankiz@frankiz.polytechnique.fr). Il doit alors donner :

  • l'url complète de la page de login de son site
  • les informations auxquelles il souhaite accéder
  • une justification de la demande (et oui, on ne partage évidemment pas notre base de données avec n'importe qui !)

Si la demande est acceptée, l'équipe frankiz renvoie alors une clé permettant d'authentifier les échanges d'informations entre frankiz et le site externe. Le site est alors inscrit dans notre base de données, et peut utiliser le système d'authentification externe.

Ci dessous un exemple commenté de script d'authentification, à mettre sur le site externe :

<?php
   header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
   // Première étape, côté client
   /**
    * Prendre le timestamp permet d'éviter le rejeu de la requête
    */
   $timestamp = time();
   /**
    * url de la page de login, doit correspondre *exactement* à celle entrée dans
    * la base de données de Frankiz (définie lors de l'inscription)
    */
   $site = 'http://monsite/login';
   /**
    * Champ non utile pour l'authentification et retransmis tel quel par frankiz. 
    * Il est prévu pour pouvoir mettre en place un système de redirection après 
    * authentification, vers la page à partir de laquelle le client avait tenté de se connecter.
    */
   $location  = "..." 
   /**
    * Nature de la requête.
    * Fkz renverra ici à la fois les noms de la personne mais aussi ses droits dans différents groupes.
    * Il faut cependant que le site ait les droits sur les informations en question (à définir lors de son inscription).
    */
   $request = json_encode(array('names', 'rights', 'email', 'sport', 'promo', 'photo'));
   /**
    * Clé secrète fournie par l'équipe frankiz lors de l'inscription du site.
    * Cette clé sert à signer les requêtes et à authentifier le site.
    */
   $key = "...";
   $hash = md5($timestamp . $site . $key . $request);
   /**
    * Redirection vers Frankiz
    */
   $remote  = 'https://www.frankiz.net/remote?timestamp=' . $timestamp .
       '&site=' . $site .
       '&location=' . $location .
       '&hash=' . $hash .
       '&request=' . $request;
   header("Location:" . $remote);
   // 2nd étape, côté frankiz :
   // regarder sur git.frankiz.net si le code le code vous intéresse
   // 3ème étape, côté client :
   /**
    * On récupère le timestamp envoyé la première fois et
    * on vérifier sa cohérence.
    */
   $timestamp = $_GET['timestamp'];
   if (abs($timestamp - time()) < 600) {
       /**
        * On récupère la réponse et on vérifie son intégrité.
        * La clé utilisée est la même qu'à l'étape 1.
        */
       $response = $_GET['response'];
       if (md5($timestamp . $key . $response) == $_GET['hash']) {
           /**
            * On décode la réponse qui est en JSON.
            * On peut vérifier le niveau de droit de l'utilisateur dans certains groupes renvoyés.
            */
           $response = json_decode($response, true);
           if (in_array('admin', $response['rights']['my_group'])) {
               echo 'gagné !';
           }
       }
   }
?>