« Frankiz » : différence entre les versions

De WikiBR
m (Back to the future)
(Réécriture du code d'authentification Frankiz)
Ligne 32 : Ligne 32 :


<code php>
<code php>
  <?php
  <?php
     header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
     header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');


     //première étape, côté client
     // Première étape, côté client
 
     /**
     $timestamp = time(); // prendre le timestamp permet d'éviter le rejeu de la requête
    * Prendre le timestamp permet d'éviter le rejeu de la requête
     $site = 'http://monsite/login'; // 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)
    */
 
     $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  = "..."  
     $location  = "..."  
     // 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
    * Nature de la requête.
    // authentification, vers la page à partir de laquelle le client avait tenté de se connecter.
    * 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'));
    */
    // Nature de la requête.
     $request = json_encode(array('names', 'rights', 'email', 'sport', 'promo', 'photo'));
    // 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).
    * 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 = "..."; // clé fournie par l'équipe frankiz lors de l'inscription du site
    */
 
    $key = "...";
     $hash = md5($timestamp . $site . $key . $request);
     $hash = md5($timestamp . $site . $key . $request);
     // On hash le tout authentifier les données
     /**
 
    * Redirection vers Frankiz
     $remote  = $globals->frankiz->url . '/remote?' . 'timestamp=' . $timestamp . '&site=' . $site . '&location=' . $location . '&hash=' . $hash . '&request=' . $request;
    */
     header("Location:" . $remote); // et on redirige
     $remote  = 'https://www.frankiz.net/remote?timestamp=' . $timestamp .
        '&site=' . $site .
        '&location=' . $location .
        '&hash=' . $hash .
        '&request=' . $request;
     header("Location:" . $remote);


     // 2nd étape, côté frankiz :
     // 2nd étape, côté frankiz :
     // regarder sur git.frankiz.net si le code le code vous intéresse
     // regarder sur git.frankiz.net si le code le code vous intéresse


     // 3ème étape, côté client :
     // 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'];
     $timestamp = $_GET['timestamp'];
    // On récupère le timestamp envoyé la première fois
     if (abs($timestamp - time()) < 600) {
 
        /**
     if (abs($timestamp - time()) < 600)
        * On récupère la réponse et on vérifie son intégrité.
    { // On vérifie qu'il est cohérent
        * La clé utilisée est la même qu'à l'étape 1.
         $response = $_GET['response']; // On vérifie le hash de la réponse
        */
         if (md5($timestamp . $globals->frankiz->key . $response) == $_GET['hash'])
         $response = $_GET['response'];
        {
         if (md5($timestamp . $key . $response) == $_GET['hash']) {
             $response = json_decode($response, true); // On décode la réponse qui est en json
            /**
             if (in_array('admin', $response['rights']['my_group']))
            * 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
            * 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é !';
                 echo 'gagné !';
             }
             }
         }
         }
     }
     }
       
   
  ?>
  ?>
</code>
</code>

Version du 26 novembre 2011 à 14:35

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é !';
           }
       }
   }
?>