Discussion : proposition d'alternative à django-allauth-ens #1

Closed
opened 2020-05-11 03:14:22 +02:00 by mpepin · 15 comments
mpepin commented 2020-05-11 03:14:22 +02:00 (Migrated from git.eleves.ens.fr)

Contexte

On a besoin un peu partout d'auth CAS + exté, typiquement sur gestioCOF, le gestioBDS à venir, l'annuaire, le wiki, etc. django-allauth-ens propose cette fonctionnalité et gère les conflits de username entre comptes extés existants et comptes clippers. Il est possible aussi de gérer la non-unicité des clippers, i.e. le fait que rien n'empêche le SPI de redonner un jour des logins clipper ayant déjà été utilisé par le passé.

Problèmes :

Proposition alternative à allauth-ens

Le but de ce dépôt est d'essayer de reprendre les bonnes idées de django-allauth-ens dans une lib plus simple à utiliser et sans la dépendance à allauth. C'est volontairement moins générique pour tenir en peu de lignes code et pouvoir être compris et utilisé facilement.

C'est encore un prototype. J'ouvre cette issue tôt pour avoir un retour critique et une discussion sur le design de base et/ou sur la pertinence de recoder un module d'auth pour l'ENS. Autrement dit, lâchez vous.

Design

On maintient une table Clipper qui lie des Users Django à un login clipper et une année d'entrée à l'ENS:

class Clipper(models.Model):
    user = models.OneToOneField(User, ...)
    uid = models.CharField(...)  # aka le login clipper
    entrance_year = models.SmallIntegerField(...)

Ça permet deux choses :

  • le username d'une personne n'a pas a être égal à son login clipper → si un username est déjà pris quand on veut inscrire quelqu'un avec un clipper, c'est pas grave.
  • le entrance_year permet de lever l’ambiguïté dans le cas théorique où le SPI décide de réutiliser des vieux logins clipper un jour.

Authentification

On ajoute un backend d'auth qui connecte par cas en utilisant le champ uid de cette table plutôt que User.username. À chaque connexion, le CAS nous donnes assez de métadonnées pour connaître la promo de la personne, on en profite pour vérifier que le compte clipper qu'on connaît est toujours valide, c'est à dire si le entrance_year qu'on a stocké correspond à la promo.

Création manuelle d'Users

Je n'ai pas encore écrit le helper pour faire ça mais quand on veut créer manuellement un User avec un login clipper, il faut ajouter une entrée dans la table Clipper et aller chercher le numéro de promo dans le ldap.

Choix discutables ?

  • Recoder un truc from scratch plutôt qu'essayer d'améliorer django-allauth-ens ?

  • Je n'ai pas utilisé django_cas_ng et j'ai recodé un petit backend d'auth.

    • pour : c'est assez simple grâce à python-cas (je ne l'aurais pas fait sinon)
    • pour : ça évite d'avoir à configurer django_cas_ng quand on utilise AuthENS
    • pour : je n'étais pas sûr de pouvoir faire tout ce que je voulais avec django_cas_ng
    • contre : c'est dommage de recoder un CAS alors que django_cas_ng existe
    • contre : en fait c'est peut-être possible de faire la même chose en utilisant bien les options de django_cas_ng, il faut que je regarde
    • question : django_cas_ng maintient une table de tickets qu'il n'a pas l'air d'utiliser, à quoi ça sert à part savoir qui est connecté ? Est-ce qu'on a besoin de ça ?

TODO

  • Fournir un script pour migrer d'une install sans AuthENS → avec AuthENS ?
  • Gérer les adresses emails : ajouter un user.email = "{}@clipper.ens.fr".format(uid) quelque part
  • J'ai oublié le .strip().lowercase()
  • Formulaire de récupération de mot de passe
  • Faire des vrais templates :
    • avec du CSS
    • avec du texte explicatif sur les méthodes de connexion
  • Indiquer au logout qu'on est déconnecté du site mais pas de CAS. Si on n'aime pas de comportement on peut aussi déconnecter les gens du CAS

Liens pertinents

## Contexte On a besoin un peu partout d'auth CAS + exté, typiquement sur gestioCOF, le gestioBDS à venir, l'annuaire, le wiki, etc. [django-allauth-ens](https://git.eleves.ens.fr/klub-dev-ens/django-allauth-ens) propose cette fonctionnalité et gère les conflits de `username` entre comptes extés existants et comptes clippers. Il est possible aussi de gérer la non-unicité des clippers, i.e. le fait que rien n'empêche le SPI de redonner un jour des logins clipper ayant déjà été utilisé par le passé. Problèmes : - django-allauth-ens est intégré avec django-allauth qui est une usine à gaz - utiliser django-allauth-ens est tout sauf simple - la gestion de la non-unicité des clippers implique une intervention manuelle tous les ans et est buguée https://git.eleves.ens.fr/klub-dev-ens/django-allauth-ens/issues/6 ## Proposition alternative à allauth-ens Le but de ce dépôt est d'essayer de reprendre les bonnes idées de django-allauth-ens dans une lib plus simple à utiliser et sans la dépendance à allauth. C'est volontairement moins générique pour tenir en peu de lignes code et pouvoir être compris et utilisé facilement. C'est encore un prototype. J'ouvre cette issue tôt pour avoir un retour critique et une discussion sur le design de base et/ou sur la pertinence de recoder un module d'auth pour l'ENS. Autrement dit, lâchez vous. ## Design On maintient une table `Clipper` qui lie des `User`s Django à un login clipper et une année d'entrée à l'ENS: ```python class Clipper(models.Model): user = models.OneToOneField(User, ...) uid = models.CharField(...) # aka le login clipper entrance_year = models.SmallIntegerField(...) ``` Ça permet deux choses : - le `username` d'une personne n'a pas a être égal à son login clipper → si un username est déjà pris quand on veut inscrire quelqu'un avec un clipper, c'est pas grave. - le `entrance_year` permet de lever l’ambiguïté dans le cas théorique où le SPI décide de réutiliser des vieux logins clipper un jour. ### Authentification On ajoute un backend d'auth qui connecte par cas en utilisant le champ `uid` de cette table plutôt que `User.username`. À chaque connexion, le CAS nous donnes assez de métadonnées pour connaître la promo de la personne, on en profite pour vérifier que le compte clipper qu'on connaît est toujours valide, c'est à dire si le `entrance_year` qu'on a stocké correspond à la promo. ### Création manuelle d'`User`s Je n'ai pas encore écrit le helper pour faire ça mais quand on veut créer manuellement un `User` avec un login clipper, il faut ajouter une entrée dans la table `Clipper` et aller chercher le numéro de promo dans le ldap. ## Choix discutables ? - Recoder un truc from scratch plutôt qu'essayer d'améliorer `django-allauth-ens` ? - Je n'ai pas utilisé `django_cas_ng` et j'ai recodé un petit backend d'auth. - pour : c'est assez simple grâce à `python-cas` (je ne l'aurais pas fait sinon) - pour : ça évite d'avoir à configurer `django_cas_ng` quand on utilise AuthENS - pour : je n'étais pas sûr de pouvoir faire tout ce que je voulais avec `django_cas_ng` - contre : c'est dommage de recoder un CAS alors que `django_cas_ng` existe - contre : en fait c'est peut-être possible de faire la même chose en utilisant bien les options de `django_cas_ng`, il faut que je regarde - question : `django_cas_ng` maintient une table de tickets qu'il n'a pas l'air d'utiliser, à quoi ça sert à part savoir qui est connecté ? Est-ce qu'on a besoin de ça ? ## TODO - [ ] ~~Fournir un script pour migrer d'une install sans AuthENS → avec AuthENS ?~~ - [x] Gérer les adresses emails : ajouter un `user.email = "{}@clipper.ens.fr".format(uid)` quelque part - [x] J'ai oublié le `.strip().lowercase()` - [x] Formulaire de récupération de mot de passe - [x] Faire des vrais templates : - avec du CSS - ~~avec du texte explicatif sur les méthodes de connexion~~ - [x] ~~Indiquer au logout qu'on est déconnecté du site mais **pas** de CAS. Si on n'aime pas de comportement on peut aussi déconnecter les gens du CAS~~ ## Liens pertinents - doc `python-cas` : https://djangocas.dev/docs/latest/modules/python_cas.html - doc de `django-cas-ng` : https://djangocas.dev/docs/latest/index.html - doc Django de l'auth "custom" : https://docs.djangoproject.com/en/3.0/topics/auth/customizing/
mpepin commented 2020-05-11 10:03:49 +02:00 (Migrated from git.eleves.ens.fr)

changed the description

changed the description
mpepin commented 2020-05-11 17:45:23 +02:00 (Migrated from git.eleves.ens.fr)

Gérer les adresses emails

→ Utiliser le mail fourni par le CAS.

> Gérer les adresses emails → Utiliser le mail fourni par le CAS.
lstephan commented 2020-05-11 17:51:00 +02:00 (Migrated from git.eleves.ens.fr)

Sur le principe, j'aime beaucoup 😃
Quelques remarques :

  • j'ai tendance (et Django aussi) à préférer les class-based views, notamment sur les apps "externes" : ça se customise bcp plus facilement;
  • je trouve ça dangereux de logout les utilisateur·ices sans les logout de CAS, notamment sur les ordinateurs partagés; je ne vois pas vraiment de usecase où on voudrait se déconnecter d'un site mais pas du CAS...
  • les tickets (ProxyGrantingTicket) sont un usecase qui nous est inutile : https://apereo.github.io/cas/5.0.x/installation/Configuring-Proxy-Authentication.html
  • sur django_cas_ng : je ne pense pas que ce soit nécessaire, le code est assez succint tel quel...
Sur le principe, j'aime beaucoup :smiley: Quelques remarques : - j'ai tendance (et Django aussi) à préférer les class-based views, notamment sur les apps "externes" : ça se customise bcp plus facilement; - je trouve ça dangereux de logout les utilisateur·ices sans les logout de CAS, notamment sur les ordinateurs partagés; je ne vois pas vraiment de usecase où on voudrait se déconnecter d'un site mais pas du CAS... - les tickets (`ProxyGrantingTicket`) sont un usecase qui nous est inutile : https://apereo.github.io/cas/5.0.x/installation/Configuring-Proxy-Authentication.html - sur `django_cas_ng` : je ne pense pas que ce soit nécessaire, le code est assez succint tel quel...
mpepin commented 2020-05-11 18:00:39 +02:00 (Migrated from git.eleves.ens.fr)

→ Remarque de ludo sur merle : #2

→ Remarque de ludo sur merle : #2
mpepin commented 2020-05-11 18:01:33 +02:00 (Migrated from git.eleves.ens.fr)

mentioned in issue #3

mentioned in issue #3
mpepin commented 2020-05-15 20:43:32 +02:00 (Migrated from git.eleves.ens.fr)

changed milestone to %1

changed milestone to %1
mpepin commented 2020-05-16 01:36:23 +02:00 (Migrated from git.eleves.ens.fr)

changed the description

changed the description
mpepin commented 2020-05-29 16:40:08 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item J'ai oublié le .strip().lowercase() as completed

marked the checklist item **J'ai oublié le `.strip().lowercase()`** as completed
mpepin commented 2020-05-29 16:40:14 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Faire des vrais templates : as completed

marked the checklist item **Faire des vrais templates :** as completed
mpepin commented 2020-05-29 16:40:16 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Faire des vrais templates : as incomplete

marked the checklist item **Faire des vrais templates :** as incomplete
mpepin commented 2020-05-29 16:40:25 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Indiquer au logout qu'on est déconnecté du site mais pas de CAS. Si on n'aime pas de comportement on peut aussi déconnecter les gens du CAS as completed

marked the checklist item **Indiquer au logout qu'on est déconnecté du site mais **pas** de CAS. Si on n'aime pas de comportement on peut aussi déconnecter les gens du CAS** as completed
mpepin commented 2020-05-29 16:40:57 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Faire des vrais templates : as completed

marked the checklist item **Faire des vrais templates :** as completed
lstephan commented 2020-06-12 17:18:08 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Gérer les adresses emails : ajouter un user.email = "{}@clipper.ens.fr".format(uid) quelque part as completed

marked the checklist item **Gérer les adresses emails : ajouter un `user.email = "{}@clipper.ens.fr".format(uid)` quelque part** as completed
mpepin commented 2021-04-13 21:50:16 +02:00 (Migrated from git.eleves.ens.fr)

changed the description

changed the description
mpepin commented 2021-04-13 21:50:23 +02:00 (Migrated from git.eleves.ens.fr)

marked the checklist item Formulaire de récupération de mot de passe as completed

marked the checklist item **Formulaire de récupération de mot de passe** as completed
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: DGNum/authens#1
No description provided.