<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikibr.binets.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Antoine.balestrat</id>
	<title>WikiBR - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wikibr.binets.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Antoine.balestrat"/>
	<link rel="alternate" type="text/html" href="https://wikibr.binets.fr/Sp%C3%A9cial:Contributions/Antoine.balestrat"/>
	<updated>2026-07-16T15:39:56Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wikibr.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8503</id>
		<title>Authentification Frankiz</title>
		<link rel="alternate" type="text/html" href="https://wikibr.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8503"/>
		<updated>2016-10-21T16:23:21Z</updated>

		<summary type="html">&lt;p&gt;Antoine.balestrat : /* Code des fonctions utilisées dans fkz_auth.php */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frankiz permet à des sites externes (binets en particulier) d&#039;utiliser sa base de données pour authentifier les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Le webmaster du site en question doit auparavant faire une demande de mise en place de ce système en envoyant un mail à l&#039;équipe frankiz ([mailto:web@eleves.polytechnique.fr web@eleves.polytechnique.fr]).&lt;br /&gt;
Il doit alors donner :&lt;br /&gt;
* l&#039;url complète de la page de login de son site (plus précisément, l&#039;URL de callback)&lt;br /&gt;
* les informations auxquelles il souhaite accéder&lt;br /&gt;
* une justification de la demande (et oui, on ne partage évidemment pas notre base de données avec n&#039;importe qui !)&lt;br /&gt;
&lt;br /&gt;
Si la demande est acceptée, un admin Frankiz va alors inscrire ton site dans notre base de donnée de sites externes et générer une clé qu&#039;il va te communiquer. Cette opération se déroule via l&#039;interface d&#039;administration de frankiz. Cette clé va te permettre d&#039;authentifier les échanges d&#039;informations entre frankiz et le site externe.&lt;br /&gt;
&lt;br /&gt;
==Liste des informations disponibles==&lt;br /&gt;
&lt;br /&gt;
Tu peux demander l&#039;accès aux informations &lt;br /&gt;
&lt;br /&gt;
* names : prénom, nom, surnom, identifiant Frankiz&lt;br /&gt;
* email : adresse mail&lt;br /&gt;
* photo : URL vers la photo TOL&lt;br /&gt;
* promo : nom du premier groupe promo&lt;br /&gt;
* sport : nom de la section sportive (si applicable)&lt;br /&gt;
* rights : droits dans les groupes associés&lt;br /&gt;
* binets_admin : liste des binets dont l&#039;utilisateur est administrateur&lt;br /&gt;
&lt;br /&gt;
==Code de la page d&#039;identification en PHP==&lt;br /&gt;
Ci dessous un exemple commenté de script d&#039;authentification, à mettre sur le site externe :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include &#039;fkz_auth.php&#039;;&lt;br /&gt;
if(!isset($_GET[&#039;response&#039;])){&lt;br /&gt;
  frankiz_do_auth();&lt;br /&gt;
}&lt;br /&gt;
$auth = frankiz_get_response();&lt;br /&gt;
// et voila !&lt;br /&gt;
// les données sont stockées dans $auth = array(key =&amp;gt; value, ...);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code des fonctions utilisées dans &#039;&#039;fkz_auth.php&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Clé secrète fournie par l&#039;équipe frankiz lors de l&#039;inscription du site.&lt;br /&gt;
 * Cette clé sert à signer les requêtes et à authentifier le site.&lt;br /&gt;
 */&lt;br /&gt;
$FKZ_KEY = &amp;quot;000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function frankiz_do_auth(){&lt;br /&gt;
   global $FKZ_KEY;&lt;br /&gt;
  /**&lt;br /&gt;
   * Prendre le timestamp permet d&#039;éviter le rejet de la requête&lt;br /&gt;
   */&lt;br /&gt;
  $timestamp = time();&lt;br /&gt;
  /**&lt;br /&gt;
   * url de la page de login, doit correspondre *exactement* à celle entrée dans&lt;br /&gt;
   * la base de données de Frankiz (définie lors de l&#039;inscription)&lt;br /&gt;
   */&lt;br /&gt;
  $site = &#039;http://monsite/login&#039;;&lt;br /&gt;
  /**&lt;br /&gt;
   * Champ non utile pour l&#039;authentification et retransmis tel quel par frankiz. &lt;br /&gt;
   * Il est prévu pour pouvoir mettre en place un système de redirection après &lt;br /&gt;
   * authentification, vers la page à partir de laquelle le client avait tenté de se connecter.&lt;br /&gt;
   */&lt;br /&gt;
  $location  = &amp;quot;...&amp;quot;;&lt;br /&gt;
  /**&lt;br /&gt;
   * Nature de la requête.&lt;br /&gt;
   * Fkz renverra ici à la fois les noms de la personne mais aussi ses droits dans différents groupes.&lt;br /&gt;
   * Il faut cependant que le site ait les droits sur les informations en question (à définir lors de son inscription).&lt;br /&gt;
   */&lt;br /&gt;
  $request = json_encode(array(&#039;names&#039;, &#039;rights&#039;, &#039;email&#039;, &#039;sport&#039;, &#039;promo&#039;, &#039;photo&#039;));&lt;br /&gt;
  &lt;br /&gt;
  $hash = md5($timestamp . $site . $FKZ_KEY . $request);&lt;br /&gt;
  &lt;br /&gt;
  $remote  = &#039;https://www.frankiz.net/remote?timestamp=&#039; . $timestamp .&lt;br /&gt;
      &#039;&amp;amp;site=&#039; . $site .&lt;br /&gt;
      &#039;&amp;amp;location=&#039; . $location .&lt;br /&gt;
      &#039;&amp;amp;hash=&#039; . $hash .&lt;br /&gt;
      &#039;&amp;amp;request=&#039; . $request;&lt;br /&gt;
   header(&amp;quot;Location:&amp;quot; . $remote);&lt;br /&gt;
   exit();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function frankiz_get_response(){&lt;br /&gt;
   global $FKZ_KEY;&lt;br /&gt;
   // Read request&lt;br /&gt;
   $timestamp = (isset($_GET[&#039;timestamp&#039;]) ? $_GET[&#039;timestamp&#039;] : 0);&lt;br /&gt;
   $response  = (isset($_GET[&#039;response&#039;])  ? urldecode($_GET[&#039;response&#039;])  : &#039;&#039;);&lt;br /&gt;
   $hash      = (isset($_GET[&#039;hash&#039;])      ? $_GET[&#039;hash&#039;]      : &#039;&#039;);&lt;br /&gt;
   $location  = (isset($_GET[&#039;location&#039;])  ? $_GET[&#039;location&#039;]  : &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
   // Frankiz security protocol&lt;br /&gt;
   if (abs($timestamp - time()) &amp;gt; 600)&lt;br /&gt;
      die(&amp;quot;Délai de réponse dépassé. Annulation de la requête&amp;quot;);&lt;br /&gt;
   if (md5($timestamp . $FKZ_KEY . $response) != $hash)&lt;br /&gt;
      die(&amp;quot;Session compromise.&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
   $response = json_decode($response, true);&lt;br /&gt;
   $response[&#039;location&#039;] = $location;&lt;br /&gt;
&lt;br /&gt;
   // Set empty fields&lt;br /&gt;
   $fields = array(&#039;hruid&#039;,&lt;br /&gt;
     &#039;firstname&#039;, &#039;lastname&#039;, &#039;nickname&#039;,&lt;br /&gt;
     &#039;promo&#039;, &#039;photo&#039;, &#039;location&#039;);&lt;br /&gt;
   foreach ($fields as $k) {&lt;br /&gt;
      if (!isset($response[$k]))&lt;br /&gt;
      $response[$k] = &#039;&#039;;&lt;br /&gt;
   }&lt;br /&gt;
   return $response;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Avec Django==&lt;br /&gt;
L&#039;interfaçage avec Django n&#039;est pas trivial, pour le faire proprement il faudrait coder un backend d&#039;authentification. En attendant, le code ci dessous est un peu sale mais marche. Il sauve l&#039;username frankiz dans la session, ce qui est raisonnablement safe normalement.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def logout(request):&lt;br /&gt;
    del request.session[&amp;quot;username&amp;quot;]&lt;br /&gt;
    request.session.modified = True&lt;br /&gt;
    return redirect(&amp;quot;/&amp;quot;) &lt;br /&gt;
 &lt;br /&gt;
def fkz_answer(request): &lt;br /&gt;
    if not &amp;quot;timestamp&amp;quot; in request.GET.keys() or not &amp;quot;response&amp;quot; in request.GET.keys() or not &amp;quot;hash&amp;quot; in request.GET.keys(): &lt;br /&gt;
        return redirect(&amp;quot;/login_required/&amp;quot;)&lt;br /&gt;
    response = request.GET.get(&amp;quot;response&amp;quot;)&lt;br /&gt;
    ts = request.GET.get(&amp;quot;timestamp&amp;quot;)&lt;br /&gt;
    h = request.GET.get(&amp;quot;hash&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if abs(int(time.time()) - int(ts)) &amp;gt; 600:&lt;br /&gt;
        return redirect(&amp;quot;/login_required/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if hashlib.md5(ts + FKZ_KEY + response).hexdigest() != h:&lt;br /&gt;
        return redirect(&amp;quot;/login_required/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    data = json.loads(response)&lt;br /&gt;
    request.session[&#039;username&#039;] = data[&#039;hruid&#039;]&lt;br /&gt;
    return redirect(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def fkz_do_login(request):&lt;br /&gt;
    ts = time.time()&lt;br /&gt;
    page = &amp;quot;http://***/fkz_answer/&amp;quot;&lt;br /&gt;
    r = json.dumps([&amp;quot;names&amp;quot;, &amp;quot;email&amp;quot;])&lt;br /&gt;
    h = hashlib.md5(ts + page + FKZ_KEY + r).hexdigest()&lt;br /&gt;
    return redirect(&amp;quot;http://www.frankiz.net/remote?&amp;quot;+urlencode([(&#039;timestamp&#039;,ts),(&#039;site&#039;,page),(&#039;hash&#039;,h),(&#039;request&#039;,r)]))&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Avec Drupal==&lt;br /&gt;
&lt;br /&gt;
L&#039;implémentation de l&#039;authentification avec un CMS comme Drupal n&#039;est pas forcément évidente. Si vous avez une question, vous pouvez contacter [mailto:antoine.sauvage@polytechnique.edu Antoine Sauvage]&lt;br /&gt;
&lt;br /&gt;
==Bugs vécus==&lt;br /&gt;
&lt;br /&gt;
Si l&#039;authentification ne fonctionne pas sur certains navigateurs, vérifier les variables $_GET car elles sont peut être doublement encodées. Dans ce cas, soit refaire &#039;&#039;&#039;urldecode&#039;&#039;&#039;, soit un &lt;br /&gt;
 $s = str_replace(&#039;%22&#039;,&#039;&amp;quot;&#039;,$s);&lt;br /&gt;
Si il y a un problème avec les encodages en \u&#039;&#039;machinchose&#039;&#039; pour les caractères accentués, voila une fonction qui peut vous servir (reconversion en UTF-8) :&lt;br /&gt;
 function jsonClean($s) {&lt;br /&gt;
   return preg_replace(&amp;quot;/\\\\u([a-f0-9]{4})/e&amp;quot;, &amp;quot;iconv(&#039;UCS-4LE&#039;,&#039;UTF-8&#039;,pack(&#039;V&#039;, hexdec(&#039;U$1&#039;)))&amp;quot;,$s);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Dev]]&lt;/div&gt;</summary>
		<author><name>Antoine.balestrat</name></author>
	</entry>
</feed>