« Authentification Frankiz » : différence entre les versions

De WikiBR
(Page créée avec « Pour utiliser l'authentification via frankiz il faut faire une demande au BR en précisant les données souhaitées et l'url de la page sur laquelle retournera l'utilisateur ... »)
 
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
Pour utiliser l'authentification via frankiz il faut faire une demande au BR en précisant les données souhaitées et l'url de la page sur laquelle retournera l'utilisateur une fois authentifié.
Frankiz permet à des sites externes (binets en particulier) d'utiliser sa base de données pour authentifier les utilisateurs.


'''Code de la page d'identification'''
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 !)


<nowiki><?php
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.
include 'fkz_auth.php';
Le site est alors inscrit dans notre base de données, et peut utiliser le système d'authentification externe.
if(!isset($_GET['response'])){
frankiz_do_auth();
}
$auth = frankiz_get_response();
// et voila !
// les données sont stockées dans $auth = array(key => value, ...);</nowiki>


'''Code des fonctions utilisées dans la page précédente'''
Ci dessous un exemple commenté de script d'authentification, à mettre sur le site externe :
<nowiki><?php
$FKZ_KEY = "000";//</nowiki>'''clé donnée par le BR-man contacté'''<nowiki>


function frankiz_do_auth(){
==Code de la page d'identification==
global $FKZ_KEY;
$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://example.com/login.php';
/**
* 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  = '';


$request = json_encode(array('names', 'rights', 'email', 'sport', 'promo', 'photo'));//données voulues
<code php>
<?php
include 'fkz_auth.php';
if(!isset($_GET['response'])){
  frankiz_do_auth();
}
$auth = frankiz_get_response();
// et voila !
// les données sont stockées dans $auth = array(key => value, ...);
</code>


$hash = md5($timestamp . $site . $FKZ_KEY . $request);
==Code des fonctions utilisées dans ''fkz_auth.php''==
<code php>


$remote = 'https://www.frankiz.net/remote?timestamp=' . $timestamp .
  <?php
'&site=' . $site .
/**
'&location=' . urlencode(urlencode($location)) . // il faut le faire deux fois !? à mon avis il y a un bug côté BR
* Clé secrète fournie par l'équipe frankiz lors de l'inscription du site.
'&hash=' . $hash .
* Cette clé sert à signer les requêtes et à authentifier le site.
'&request=' . $request;
*/
header("Location:" . $remote);
$FKZ_KEY = "000";
exit();
}


function frankiz_get_response(){
function frankiz_do_auth(){
global $FKZ_KEY;
    global $FKZ_KEY;
// Read request
  /**
$timestamp = (isset($_GET['timestamp']) ? $_GET['timestamp'] : 0);
    * Prendre le timestamp permet d'éviter le rejeu de la requête
$response = (isset($_GET['response'])  ? urldecode($_GET['response'])  : '');
    */
$hash   = (isset($_GET['hash'])   ? $_GET['hash']   : '');
  $timestamp = time();
$location = (isset($_GET['location'])  ? $_GET['location': '');
  /**
    * 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'));
 
  $hash = md5($timestamp . $site . $FKZ_KEY . $request);
   $remote  = 'https://www.frankiz.net/remote?timestamp=' . $timestamp .
    '&site=' . $site .
    '&location=' . $location .
    '&hash=' . $hash .
    '&request=' . $request;
  header("Location:" . $remote);
  exit();
}


// Frankiz security protocol
function frankiz_get_response(){
if (abs($timestamp - time()) > 600)
  global $FKZ_KEY;
die("Délai de réponse dépassé. Annulation de la requête");
  // Read request
if (md5($timestamp . $FKZ_KEY . $response) != $hash)
  $timestamp = (isset($_GET['timestamp']) ? $_GET['timestamp'] : 0);
die("Session compromise.");
  $response  = (isset($_GET['response'])  ? urldecode($_GET['response'])  : '');
 
  $hash      = (isset($_GET['hash'])      ? $_GET['hash']      : '');
$response = json_decode($response, true);
  $location  = (isset($_GET['location'])  ? $_GET['location']  : '');
$response['location'] = $location;
 
  // Frankiz security protocol
// Set empty fields
  if (abs($timestamp - time()) > 600)
$fields = array('hruid',
    die("Délai de réponse dépassé. Annulation de la requête");
'firstname', 'lastname', 'nickname',
  if (md5($timestamp . $FKZ_KEY . $response) != $hash)
'promo', 'photo', 'location');
    die("Session compromise.");
foreach ($fields as $k) {
if (!isset($response[$k]))
  $response = json_decode($response, true);
$response[$k] = '';
  $response['location'] = $location;
}
return $response;
  // Set empty fields
}
  $fields = array('hruid',
?></nowiki>
    'firstname', 'lastname', 'nickname',
    'promo', 'photo', 'location');
  foreach ($fields as $k) {
    if (!isset($response[$k]))
    $response[$k] = '';
  }
  return $response;
}
?>
</code>

Version du 28 avril 2012 à 20:15

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 :

Code de la page d'identification

<?php
include 'fkz_auth.php';
if(!isset($_GET['response'])){
  frankiz_do_auth();
}
$auth = frankiz_get_response();
// et voila !
// les données sont stockées dans $auth = array(key => value, ...);

Code des fonctions utilisées dans fkz_auth.php

<?php
/**
* 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.
*/
$FKZ_KEY = "000";
function frankiz_do_auth(){
   global $FKZ_KEY;
  /**
   * 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'));
  
  $hash = md5($timestamp . $site . $FKZ_KEY . $request);

 $remote  = 'https://www.frankiz.net/remote?timestamp=' . $timestamp .
    '&site=' . $site .
    '&location=' . $location .
    '&hash=' . $hash .
    '&request=' . $request;
  header("Location:" . $remote);
  exit();
}
function frankiz_get_response(){
  global $FKZ_KEY;
  // Read request
  $timestamp = (isset($_GET['timestamp']) ? $_GET['timestamp'] : 0);
  $response  = (isset($_GET['response'])  ? urldecode($_GET['response'])  : );
  $hash      = (isset($_GET['hash'])      ? $_GET['hash']      : );
  $location  = (isset($_GET['location'])  ? $_GET['location']  : );

  // Frankiz security protocol
  if (abs($timestamp - time()) > 600)
    die("Délai de réponse dépassé. Annulation de la requête");
  if (md5($timestamp . $FKZ_KEY . $response) != $hash)
    die("Session compromise.");

  $response = json_decode($response, true);
  $response['location'] = $location;

  // Set empty fields
  $fields = array('hruid',
    'firstname', 'lastname', 'nickname',
    'promo', 'photo', 'location');
  foreach ($fields as $k) {
    if (!isset($response[$k]))
    $response[$k] = ;
  }
  return $response;
}
?>