<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki-br.binets.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flavien.solt</id>
	<title>WikiBR - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-br.binets.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flavien.solt"/>
	<link rel="alternate" type="text/html" href="https://wiki-br.binets.fr/Sp%C3%A9cial:Contributions/Flavien.solt"/>
	<updated>2026-10-06T03:37:37Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki-br.binets.fr/index.php?title=H%C3%A9bergement_des_sites_des_binets&amp;diff=8728</id>
		<title>Hébergement des sites des binets</title>
		<link rel="alternate" type="text/html" href="https://wiki-br.binets.fr/index.php?title=H%C3%A9bergement_des_sites_des_binets&amp;diff=8728"/>
		<updated>2018-03-28T12:54:50Z</updated>

		<summary type="html">&lt;p&gt;Flavien.solt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{menu services}}&lt;br /&gt;
&lt;br /&gt;
{{attention|Cette page va migrer vers [https://portail.polytechnique.edu/dsi/eleves/sites-binets le nouveau site de la DSI]}}&lt;br /&gt;
&lt;br /&gt;
Le BR propose aux binets qui le désirent d&#039;héberger gratuitement leur site web.&lt;br /&gt;
&lt;br /&gt;
Cet hébergement s&#039;organise selon deux formules, avec ou sans la possibilité d&#039;accéder au site de l&#039;extérieur du Plâtal.&lt;br /&gt;
&lt;br /&gt;
Pour demander l&#039;hébergement de ton site, envoie un mail à root@eleves.polytechnique.fr en précisant l&#039;identifiant du groupe/binet au nom duquel tu fais la demande (si tu ne le connais pas, donne le lien vers le groupe/binet sur Frankiz).&lt;br /&gt;
Si ledit groupe/binet n&#039;existe pas, tu peux en demander la création en envoyant un mail à web@frankiz.net.&lt;br /&gt;
&lt;br /&gt;
Tu peux également demander à mettre une [[authentification Frankiz]] sur ce site en t&#039;adressant à web@frankiz.net&lt;br /&gt;
&lt;br /&gt;
Voici un [[Tuto pour le déploiement des sites Django]] des sites binets codés en django.&lt;br /&gt;
&lt;br /&gt;
== Sans visibilité extérieure ==&lt;br /&gt;
&lt;br /&gt;
Les sites internes sont hébergés sur [[Admin:Ostizan | Ostizan]].&lt;br /&gt;
&lt;br /&gt;
L&#039;administration du site se fait par accès ftp ou ssh. Il est ouvert à tous les administrateurs Frankiz du binet considéré, et à eux seuls.&lt;br /&gt;
&lt;br /&gt;
L&#039;écriture du site est bien entendu à la charge du webmaster du binet ; en cas de nécessité et pour une raison valable, un BRman pourra cependant proposer son aide.&lt;br /&gt;
&lt;br /&gt;
L&#039;adresse du site est alors mon_binet.binets.fr ou mon_binet.binets.eleves.polytechnique.fr, ou plus simplement mon_binet.bin ;&lt;br /&gt;
&lt;br /&gt;
Voir par exemple le site de la Diskhâle Classique : [http://dhc.binets.fr http://dhc.binets.fr]  ou [http://dhc.binets.eleves.polytechnique.fr http://dhc.binets.eleves.polytechnique.fr] ou [http://dhc.bin http://dhc.bin].&lt;br /&gt;
&lt;br /&gt;
Pour accéder aux fichiers, il faut utiliser un client FTP (comme [http://filezilla-project.org/ FilleZilla Client]) et accéder au serveur [ftp://binets ftp://binets]. Le serveur FTP demande un login/mot de passe qui correspondent exactement aux comptes Frankiz. Le dossier ftp://binets/www/UN_BINET/htdocs/ correspond au site http://UN_BINET.binets.fr/. Les fichiers qui ne sont pas dans htdocs ne sont pas accessible directement par un navigateur, mais un script PHP peut y accéder.&lt;br /&gt;
&lt;br /&gt;
La base de données MySQL est accessible par un PhpMyAdmin : [http://phpmyadmin.bin/ http://phpmyadmin.bin/] (ou .binets, mais pas .binets.fr). Le nom d&#039;utilisateur correspond au nom du binet tel qu&#039;il apparaît dans le nom de domaine. Le mot de passe a été donné au binet à la création de la base SQL ; le BR ne le possède pas et vous devez le passer à vos successeurs pour éviter de le perdre à tout jamais.&lt;br /&gt;
&lt;br /&gt;
== Avec visibilité extérieure ==&lt;br /&gt;
&lt;br /&gt;
Le BR s&#039;est équipé d&#039;un VPS (serveur privé virtuel à l&#039;extérieur du Plâtal) permettant d&#039;héberger des sites binets avec visibilité extérieure indépendamment des autorités de l’École. L&#039;adresse de tels sites a pour suffixe binets.fr, comme [http://br.binets.fr/ br.binets.fr] ou [http://faerix.binets.fr/ faerix.binets.fr] par exemple.&lt;br /&gt;
&lt;br /&gt;
Les sites souhaitant un site avec visibilité depuis l&#039;extérieur doivent dorénavant respecter la charte suivante :&lt;br /&gt;
&lt;br /&gt;
*Aucune information ne doit être diffusée qui pourrait nuire à l&#039;image de l’École. (photos, vidéos, etc.)&lt;br /&gt;
*Le site doit avoir une qualité visuelle, si ce n&#039;est professionnelle, du moins très correcte.&lt;br /&gt;
*Le site ne doit pas héberger de vidéos ou diffuser un flux vidéo (streaming). Toutes les vidéos du sites doivent être hébergées à l&#039;extérieur. (Dalymotion, YouTube, etc.)&lt;br /&gt;
*Les images présentes sur le site ne doivent avoir une résolution suffisamment faible afin de ne pas saturer la bande passante vers l&#039;extérieur.&lt;br /&gt;
&lt;br /&gt;
*Le BR offre ce service gratuitement, en partie grâce à une subvention de la Kès. Il se réserve le droit de refuser ou d&#039;interrompre l&#039;hébergement d&#039;un site, sans préavis, sans recours possible et sans avoir à fournir de motif. Il s&#039;engage à en informer immédiatement le bureau du binet concerné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Pour l&#039;année 2016, si le site concerne un événement extérieur avec un public de plus de 50 personnes, la DSI demande à ce que la DIRCOM soit prévenue.}}&lt;br /&gt;
&lt;br /&gt;
== Modalités techniques ==&lt;br /&gt;
L&#039;hébergement offert par le BR présente les caractéristiques suivantes :&lt;br /&gt;
* Capacité de stockage limitée à 200Mo par défaut. Il est possible d&#039;obtenir plus sur demande.&lt;br /&gt;
* Serveur apache avec PHP 5.6&lt;br /&gt;
* Base de données MySQL&lt;br /&gt;
* Possibilité d&#039;accès en HTTPS pour votre site en option.&lt;br /&gt;
* Hébergement Django avec uWSGI&lt;br /&gt;
&lt;br /&gt;
Si vous avez des besoins plus spécifiques, n&#039;hésitez pas à nous en parler.&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Services]]&lt;/div&gt;</summary>
		<author><name>Flavien.solt</name></author>
	</entry>
	<entry>
		<id>https://wiki-br.binets.fr/index.php?title=DNS&amp;diff=8707</id>
		<title>DNS</title>
		<link rel="alternate" type="text/html" href="https://wiki-br.binets.fr/index.php?title=DNS&amp;diff=8707"/>
		<updated>2017-11-18T11:01:04Z</updated>

		<summary type="html">&lt;p&gt;Flavien.solt : Update du DNS principal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{menu services}}&lt;br /&gt;
DNS pour les non initiés veut dire &#039;Domain Name Service&#039;, et désigne le service permettant l&#039;attribution d&#039;une adresse avec des lettres (lisible) à une adresse IP (avec des chiffres, donc illisible). Actuellement par exemple, les serveurs DNS font correspondre l&#039;IP 129.104.201.51 à l&#039;adresse frankiz.eleves.polytechnique.fr.&lt;br /&gt;
&lt;br /&gt;
La DNS est gérée par le [[xNetServer]] hébergé actuellement sur le serveur [[Admin:Heol|Heol]]. Les autres serveurs du BR qui font serveur DNS sont des esclaves (qui reproduisent les informations d&#039;[[Admin:Heol|Heol]]). Les DNS sont simplement dupliquées toutes les 5 minutes si le sérial a été incrémenté.&lt;br /&gt;
&lt;br /&gt;
{{attention|&#039;&#039;&#039;Archivage et vie privée.&#039;&#039;&#039; Toutes les requêtes DNS faites par les élèves passent par un serveur du BR. Lorsque qu&#039;un élève tape coincoin.com dans la barre d&#039;adresse de son navigateur, une requête du style &amp;quot;Quelle est l&#039;adresse IP de coincoin.com ?&amp;quot; est envoyée à un serveur du BR qui lui répond &amp;quot;coincoin.com a telle adresse IP&amp;quot;. &#039;&#039;&#039;Le BR ne regarde pas et ne garde aucune trace de ces requêtes.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
== Domaines gérés par le BR ==&lt;br /&gt;
{{Obsolète|Le BR n&#039;utilise plus xNet}}&lt;br /&gt;
&lt;br /&gt;
Le BR a par contrat avec la DSI obtenu la gestion de la DNS du domaine &#039;&#039;eleves.polytechnique.fr&#039;&#039;. Il est important de noter que ce domaine permet de faire bénéficier les élèves d&#039;une résolution DNS très utile pour le voisinage réseau. Ce voisinage est alors assuré par le [[xNet]].&lt;br /&gt;
&lt;br /&gt;
Le BR gère le sous-domaine {{c|eleves.polytechnique.fr}} via [[xNet]] à partir des noms que les utilisateurs spécifient dans leur client. Ce domaine est le domaine principal que doivent utiliser les élèves pour bénéficier d&#039;un maximum d&#039;aisance de vie sur le réseau. &lt;br /&gt;
&lt;br /&gt;
Les serveurs DNS du BR forwardent les requêtes du domaine &#039;&#039;polytechnique.fr&#039;&#039; aux serveurs de la DSI et sont dans la mesure du possible configurés pour que l&#039;accès à ce domaine soit le plus rapide possible. En particulier si certains serveurs DNS de la DSI sont down, nous nous assurons que les requêtes DNS sont envoyées en priorité aux machines en état de marche.&lt;br /&gt;
&lt;br /&gt;
== Serveurs de domaine ==&lt;br /&gt;
&lt;br /&gt;
Le BR met à disposition des élèves une redondance importante des serveurs DNS. Ceci permet d&#039;éviter une coupure totale de la DNS et de répartir la charge correspondante. Les serveurs assurant ce service sont :&lt;br /&gt;
* [[Admin:Trouz|Trouz]] 129.104.201.59 : serveur DNS principal&lt;br /&gt;
* [[Admin:Frankiz|Frankiz]] 129.104.201.51&lt;br /&gt;
&lt;br /&gt;
La DNS du serveur principal est dupliquée toutes les 5 minutes sur les autres machines, ce qui permet d&#039;avoir une correspondance toujours valide quels que soient les serveurs DNS que l&#039;utilisateur a choisi.&lt;br /&gt;
&lt;br /&gt;
== Comment configurer la DNS sur sa machine ? ==&lt;br /&gt;
&lt;br /&gt;
Pour configurer la DNS sur une machine il faut :&lt;br /&gt;
# définir comme serveur DNS au moins un des serveurs cités précédemment (2 permettraient d&#039;être certain d&#039;avoir une résolution DNS en cas de problème sur une machine)&lt;br /&gt;
# définir les domaines de recherche, en général : &amp;lt;code&amp;gt;eleves.polytechnique.fr polytechnique.fr&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historique ==&lt;br /&gt;
Le BR a maintenu pendant un certain temps les 2 sous-domaines :&lt;br /&gt;
* &amp;lt;code&amp;gt;windows.eleves.polytechnique.fr&amp;lt;/code&amp;gt; : ce domaine géré par le domaine Windows. Chaque machine du domaine bénéficiait d&#039;un nom de la forme $nomdemachine$.windows.eleves.polytechnique.fr où $nomdemachine$ était le nom donné sous Windows (qui peut tout à fait être différent de celui en eleves.polytechnique.fr).&lt;br /&gt;
* &amp;lt;code&amp;gt;wifi.eleves.polytechnique.fr&amp;lt;/code&amp;gt; : ce domaine était destiné à organiser le projet [[WiFi]] du BR. Il permettait aux administrateurs du réseau sans fil de retrouver facilement les bornes et les serveurs attachés.&lt;br /&gt;
&lt;br /&gt;
Le BR a utilisé puis abandonné l&#039;utilisation du protocole [[xNet]] pour la gestion des DNS du réseau élèves et le voisinage réseau.&lt;br /&gt;
&lt;br /&gt;
== Article connexes ==&lt;br /&gt;
* [[Dns_App|Dns App]]&lt;br /&gt;
* [[Admin:DNS|Administration DNS]] (privé)&lt;br /&gt;
* [[Admin:Dns_App|Administration Dns App]] (privé)&lt;br /&gt;
* [[Réseau:Attribution des adresses IP|Attribution des adresses IP]] (privé)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Services]]&lt;/div&gt;</summary>
		<author><name>Flavien.solt</name></author>
	</entry>
	<entry>
		<id>https://wiki-br.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8676</id>
		<title>Authentification Frankiz</title>
		<link rel="alternate" type="text/html" href="https://wiki-br.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8676"/>
		<updated>2017-08-21T15:05:22Z</updated>

		<summary type="html">&lt;p&gt;Flavien.solt : &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;
=== Version sale ===&lt;br /&gt;
L&#039;interfaçage de Frankiz directement 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;https://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;
Il existe cependant une autre méthode utilisant les mêmes identifiants&lt;br /&gt;
&lt;br /&gt;
=== Authentification par le CAS ===&lt;br /&gt;
&lt;br /&gt;
* Demander sur [https://panix.binets.fr Panix] à utiliser cette authentification. Préciser les éventuels attributs supplémentaires nécessaires (promo, section, ...).&lt;br /&gt;
* Installer le paquet django_cas_ng:&lt;br /&gt;
  pip install django-cas-ng&lt;br /&gt;
* Ajouter ce paquet à la liste des applications :&lt;br /&gt;
  INSTALLED_APPS = [&lt;br /&gt;
    ...&lt;br /&gt;
    &#039;django_cas_ng&#039;,&lt;br /&gt;
    ...&lt;br /&gt;
  ]&lt;br /&gt;
* Configurer la connection au serveur CAS du BR : &lt;br /&gt;
  AUTHENTICATION_BACKENDS = (&lt;br /&gt;
    &#039;django.contrib.auth.backends.ModelBackend&#039;,&lt;br /&gt;
    &#039;django_cas_ng.backends.CASBackend&#039;,&lt;br /&gt;
  )&lt;br /&gt;
  CAS_SERVER_URL = &amp;quot;https://cas.binets.fr/&amp;quot;&lt;br /&gt;
* Renseigner les pages de connexion (dans {{c|my_project/urls.py}} par exemple): &lt;br /&gt;
  from django_cas_ng.views import login, logout&lt;br /&gt;
  &lt;br /&gt;
  urlpatterns = [&lt;br /&gt;
    ...&lt;br /&gt;
    url(r&#039;^login$&#039;, login, name=&#039;cas_ng_login&#039;),&lt;br /&gt;
    url(r&#039;^logout$&#039;, logout, name=&#039;cas_ng_logout&#039;),&lt;br /&gt;
    ...&lt;br /&gt;
  ]&lt;br /&gt;
* Ajouter l&#039;URL d&#039;entrée : &lt;br /&gt;
  LOGIN_URL = &amp;quot;login&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Attention à forcer l&#039;authentification pour les pages concernées : &lt;br /&gt;
  from django.contrib.auth.decorators import login_required&lt;br /&gt;
  &lt;br /&gt;
  @login_required&lt;br /&gt;
  def my_awesome_view(request):&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
À noter : &lt;br /&gt;
* le nom de l&#039;utilisateur connecté se trouve dans : request.user.username (accessible dans n&#039;importe quelle vue).&lt;br /&gt;
* les attributs du [[LDAP]] peuvent être disponibles (demander les attributs nécessaires  lors de la mise en place du CAS). Ils sont alors disponibles dans request.session[&#039;attributes&#039;] .&lt;br /&gt;
* plus d&#039;option de configuration sont présentés [https://github.com/mingchen/django-cas-ng/tree/master/django_cas_ng ici]&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>Flavien.solt</name></author>
	</entry>
	<entry>
		<id>https://wiki-br.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8675</id>
		<title>Authentification Frankiz</title>
		<link rel="alternate" type="text/html" href="https://wiki-br.binets.fr/index.php?title=Authentification_Frankiz&amp;diff=8675"/>
		<updated>2017-08-21T15:04:47Z</updated>

		<summary type="html">&lt;p&gt;Flavien.solt : Correction django-ng-cas &amp;lt;- django-ng-cas et pareil avec les underscores.&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;
=== Version sale ===&lt;br /&gt;
L&#039;interfaçage de Frankiz directement 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;https://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;
Il existe cependant une autre méthode utilisant les mêmes identifiants&lt;br /&gt;
&lt;br /&gt;
=== Authentification par le CAS ===&lt;br /&gt;
&lt;br /&gt;
* Demander sur [https://panix.binets.fr Panix] à utiliser cette authentification. Préciser les éventuels attributs supplémentaires nécessaires (promo, section, ...).&lt;br /&gt;
* Installer le paquet django_ng_cas :&lt;br /&gt;
  pip install django-cas-ng&lt;br /&gt;
* Ajouter ce paquet à la liste des applications :&lt;br /&gt;
  INSTALLED_APPS = [&lt;br /&gt;
    ...&lt;br /&gt;
    &#039;django_cas_ng&#039;,&lt;br /&gt;
    ...&lt;br /&gt;
  ]&lt;br /&gt;
* Configurer la connection au serveur CAS du BR : &lt;br /&gt;
  AUTHENTICATION_BACKENDS = (&lt;br /&gt;
    &#039;django.contrib.auth.backends.ModelBackend&#039;,&lt;br /&gt;
    &#039;django_cas_ng.backends.CASBackend&#039;,&lt;br /&gt;
  )&lt;br /&gt;
  CAS_SERVER_URL = &amp;quot;https://cas.binets.fr/&amp;quot;&lt;br /&gt;
* Renseigner les pages de connexion (dans {{c|my_project/urls.py}} par exemple): &lt;br /&gt;
  from django_cas_ng.views import login, logout&lt;br /&gt;
  &lt;br /&gt;
  urlpatterns = [&lt;br /&gt;
    ...&lt;br /&gt;
    url(r&#039;^login$&#039;, login, name=&#039;cas_ng_login&#039;),&lt;br /&gt;
    url(r&#039;^logout$&#039;, logout, name=&#039;cas_ng_logout&#039;),&lt;br /&gt;
    ...&lt;br /&gt;
  ]&lt;br /&gt;
* Ajouter l&#039;URL d&#039;entrée : &lt;br /&gt;
  LOGIN_URL = &amp;quot;login&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Attention à forcer l&#039;authentification pour les pages concernées : &lt;br /&gt;
  from django.contrib.auth.decorators import login_required&lt;br /&gt;
  &lt;br /&gt;
  @login_required&lt;br /&gt;
  def my_awesome_view(request):&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
À noter : &lt;br /&gt;
* le nom de l&#039;utilisateur connecté se trouve dans : request.user.username (accessible dans n&#039;importe quelle vue).&lt;br /&gt;
* les attributs du [[LDAP]] peuvent être disponibles (demander les attributs nécessaires  lors de la mise en place du CAS). Ils sont alors disponibles dans request.session[&#039;attributes&#039;] .&lt;br /&gt;
* plus d&#039;option de configuration sont présentés [https://github.com/mingchen/django-cas-ng/tree/master/django_cas_ng ici]&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>Flavien.solt</name></author>
	</entry>
</feed>