<?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=Pierre-emmanuel.baviere</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=Pierre-emmanuel.baviere"/>
	<link rel="alternate" type="text/html" href="https://wikibr.binets.fr/Sp%C3%A9cial:Contributions/Pierre-emmanuel.baviere"/>
	<updated>2026-05-11T19:18:24Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wikibr.binets.fr/index.php?title=Authentification_CAS&amp;diff=9754</id>
		<title>Authentification CAS</title>
		<link rel="alternate" type="text/html" href="https://wikibr.binets.fr/index.php?title=Authentification_CAS&amp;diff=9754"/>
		<updated>2023-11-26T17:57:02Z</updated>

		<summary type="html">&lt;p&gt;Pierre-emmanuel.baviere : Added some additional info about cas attributes in local&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sigma permet à des sites externes (binets en particulier) d'utiliser sa base de données pour authentifier les utilisateurs à travers le protocole CAS 3.0.&lt;br /&gt;
&lt;br /&gt;
Le serveur CAS est situé à l'adresse [https://cas.binets.fr/ cas.binets.fr] et est lié à la base de données Sigma. Si vous souhaitez que l'ensemble du personnel de l'École (élèves compris) puisse s'authentifier, vous pouvez utiliser le [https://metacas.binets.fr/ metacas.binets.fr] qui est lui lié au LDAP de l'École.&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 créant une tâche PaniX. Il doit alors donner :&lt;br /&gt;
* l'url complète de la page de login de son site (plus précisément, l'URL de callback)&lt;br /&gt;
* les informations auxquelles il souhaite accéder&lt;br /&gt;
* son choix entre cas et metacas&lt;br /&gt;
* une justification de la demande&lt;br /&gt;
Si la demande est acceptée, un membre du BR va alors inscrire son site dans notre base de données de sites externes.&lt;br /&gt;
&lt;br /&gt;
Le domain `localhost` fait également partie des domaines acceptés par le cas. Cela permet de faire des tests en développement et de faire fonctionner le site à l'identique.&lt;br /&gt;
&lt;br /&gt;
== Liste des informations disponibles == &lt;br /&gt;
&lt;br /&gt;
Tu peux demander l'accès aux informations&lt;br /&gt;
&lt;br /&gt;
* noms : prénom, nom, surnom, identifiant BR&lt;br /&gt;
* adresse mail&lt;br /&gt;
* téléphone&lt;br /&gt;
* photo : URL vers la photo TOL&lt;br /&gt;
* numéro de chambre&lt;br /&gt;
* date de naissance&lt;br /&gt;
* groupes : promo, section, binets …&lt;br /&gt;
* droits : droits dans les groupes associés (membre, speaker, admin, follower)&lt;br /&gt;
* nationalité&lt;br /&gt;
&lt;br /&gt;
Attention, le nom des attributs varie entre le domaine localhost et les autres domaines (pour une raison inconnue). Par exemple, en production, on trouve `prenom` et `nom` alors que pour localhost on trouve `givenName` et `sn`.&lt;br /&gt;
&lt;br /&gt;
== Pour les développeurs ==&lt;br /&gt;
&lt;br /&gt;
=== CAS de développement ===&lt;br /&gt;
&lt;br /&gt;
Pour le développement, il est possible d'utiliser un serveur CAS de test qui tourne dans un container Docker avec des données fictives, ce qui permet de tester facilement les différents privilèges et le fonctionnement de la connexion. Le projet est disponible sur [https://gitlab.binets.fr/br/docker-cas GitLab].&lt;br /&gt;
&lt;br /&gt;
=== En PHP ===&lt;br /&gt;
&lt;br /&gt;
Le plus simple en PHP est d'utiliser la librairie [https://github.com/apereo/phpCAS phpCAS].&lt;br /&gt;
&lt;br /&gt;
==== Code de la page d'identification en PHP ====&lt;br /&gt;
&lt;br /&gt;
Ci-dessous un exemple très simple et commenté de script d'authentification, à mettre sur votre site :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include 'CAS_auth.php';&lt;br /&gt;
if(!isset($_GET['ticket'])){&lt;br /&gt;
  CAS_do_auth();&lt;br /&gt;
}&lt;br /&gt;
$auth = CAS_get_response();&lt;br /&gt;
&lt;br /&gt;
// et voila !&lt;br /&gt;
// les données sont stockées dans $auth = array(key, value, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(ne pas oublier d'enregistrer ces infos dans la Session après ...)&lt;br /&gt;
&lt;br /&gt;
==== Code des fonctions utilisées dans ''CAS_auth.php'' ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
function CAS_do_auth(){&lt;br /&gt;
  /**&lt;br /&gt;
   * url de la page de login, doit correspondre *exactement* à celle donnée lors de l'inscription&lt;br /&gt;
   */&lt;br /&gt;
  $site = 'http://monsite/login';&lt;br /&gt;
  /**&lt;br /&gt;
   * Il est possible de forcer la reconnexion et d'ignorer ainsi une connexion passée.&lt;br /&gt;
   */&lt;br /&gt;
  $reconnexion = false;&lt;br /&gt;
   header('Location: https://cas.binets.fr/login?service='.rawurlencode($site).'&amp;amp;renew='&lt;br /&gt;
.$reconnexion);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function CAS_get_response(){&lt;br /&gt;
   $site = 'http://monsite/login';&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Récupération de l'id de l'utilisateur correspondant à ce ticket, ainsi que les informations demandées&lt;br /&gt;
   */&lt;br /&gt;
  $response = file_get_contents('https://cas.binets.fr/serviceValidate?service='.rawurlencode($site ).'&amp;amp;ticket='&lt;br /&gt;
.$_GET['ticket']);&lt;br /&gt;
&lt;br /&gt;
  $doc = new DOMDocument();&lt;br /&gt;
  $doc-&amp;gt;loadXML($response);&lt;br /&gt;
&lt;br /&gt;
  if ($doc-&amp;gt;getElementsByTagName('authenticationFailure')-&amp;gt;length == 0) {&lt;br /&gt;
    $return = array();&lt;br /&gt;
    /**&lt;br /&gt;
     * Récupération de l'id de l'utilisateur&lt;br /&gt;
     */&lt;br /&gt;
    $return['id'] = $doc-&amp;gt;getElementsByTagName('user')-&amp;gt;item(0)-&amp;gt;textContent;&lt;br /&gt;
    /**&lt;br /&gt;
     * Récupération des données de l'utilisateur&lt;br /&gt;
     */&lt;br /&gt;
    foreach ($doc-&amp;gt;getElementsByTagName('attribute') as $attribute) {&lt;br /&gt;
      if (isset($return[$attribute-&amp;gt;getAttribute('name')])) {&lt;br /&gt;
        if (!is_array($return[$attribute-&amp;gt;getAttribute('name')])) {&lt;br /&gt;
          $return[$attribute-&amp;gt;getAttribute('name')] = [$return[$attribute-&amp;gt;getAttribute('name')]];&lt;br /&gt;
        }&lt;br /&gt;
        $return[$attribute-&amp;gt;getAttribute('name')][] = $attribute-&amp;gt;getAttribute('value');&lt;br /&gt;
      } else {&lt;br /&gt;
        $return[$attribute-&amp;gt;getAttribute('name')] = $attribute-&amp;gt;getAttribute('value');&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return $return;&lt;br /&gt;
  } else {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bugs vécus ====&lt;br /&gt;
&lt;br /&gt;
Si l'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 &amp;lt;code&amp;gt;urldecode&amp;lt;/code&amp;gt;, soit un &amp;lt;code&amp;gt;$s = str_replace('%22','&amp;quot;',$s);&amp;lt;/code&amp;gt; Si il y a un problème avec les encodages en &amp;lt;code&amp;gt;\u{whatever}&amp;lt;/code&amp;gt; pour les caractères accentués, voila une fonction qui peut vous servir (reconversion en UTF-8) :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&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('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))&amp;quot;,$s);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Avec NodeJS === &lt;br /&gt;
&lt;br /&gt;
On utilise le paquet [https://www.npmjs.com/package/cas-authentication cas-authentication].&lt;br /&gt;
&lt;br /&gt;
La [https://www.npmjs.com/package/cas-authentication page descriptive] du package décrit bien comment utiliser le middleware.&lt;br /&gt;
&lt;br /&gt;
''Notes''&lt;br /&gt;
* Pour récupérer les attributs, préciser &amp;lt;code&amp;gt;session_info&amp;lt;/code&amp;gt; dans la configuration de &amp;lt;code&amp;gt;cas-authentification&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pour un exemple basique, voir [https://gitlab.binets.fr/hadrien.renaud/cas-auth-validator ici]&lt;br /&gt;
&lt;br /&gt;
=== Avec Django ===&lt;br /&gt;
&lt;br /&gt;
* Installer le paquet django_cas_ng : &amp;lt;code&amp;gt;pip install django-cas-ng&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ajouter ce paquet à la liste des applications :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
INSTALLED_APPS = [&lt;br /&gt;
    ...&lt;br /&gt;
    'django_cas_ng',&lt;br /&gt;
    ...&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurer la connexion au serveur CAS du BR :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;py&amp;quot;&amp;gt;&lt;br /&gt;
AUTHENTICATION_BACKENDS = (&lt;br /&gt;
  'django.contrib.auth.backends.ModelBackend',&lt;br /&gt;
  'django_cas_ng.backends.CASBackend',&lt;br /&gt;
)&lt;br /&gt;
CAS_SERVER_URL = &amp;quot;https://cas.binets.fr/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Renseigner les pages de connexion (dans my_project/urls.py par exemple):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&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'^login$', login, name='cas_ng_login'),&lt;br /&gt;
    url(r'^logout$', logout, name='cas_ng_logout'),&lt;br /&gt;
    ...&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ajouter l'URL d'entrée : &amp;lt;code&amp;gt;LOGIN_URL = &amp;quot;login&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attention à forcer l'authentification pour les pages concernées :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''À noter :''&lt;br /&gt;
* le nom de l'utilisateur connecté se trouve dans : request.user.username (accessible dans n'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 &amp;lt;code&amp;gt;request.session['attributes']&amp;lt;/code&amp;gt;.&lt;br /&gt;
* plus d'options de configuration sont présentées [[https://github.com/mingchen/django-cas-ng/tree/master/django_cas_ng ici]]&lt;br /&gt;
&lt;br /&gt;
=== Avec Flask ===&lt;br /&gt;
&lt;br /&gt;
On utilise le module [[https://github.com/ravomavain/Flask-CAS flask-cas]]. Voir un exemple [[https://gitlab.binets.fr/br/cas-authenticator/-/blob/master/app.py ici]].&lt;br /&gt;
&lt;br /&gt;
=== Avec Drupal ===&lt;br /&gt;
&lt;br /&gt;
L'implémentation de l'authentification avec un CMS comme Drupal n'est pas forcément évidente. Si vous avez une question, vous pouvez contacter Antoine Sauvage&lt;/div&gt;</summary>
		<author><name>Pierre-emmanuel.baviere</name></author>
	</entry>
</feed>