Exercices Concepts Web & Django Middleware d'authentification par header
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Middleware d'authentification par header

Dans les APIs, l'authentification se fait souvent via un header HTTP. Le client envoie un header Authorization avec un token, et le serveur vérifie ce token pour identifier l'utilisateur.

En Django, les headers HTTP sont accessibles via request.META. Les headers sont prefixes par HTTP_ et convertis en majuscules. Par exemple, le header Authorization devient request.META.get('HTTP_AUTHORIZATION').

Pour les tests, on peut aussi les definir directement avec request.META['HTTP_AUTHORIZATION'] = 'Token abc123'.

Écris un middleware TokenAuthMiddleware (new style) qui :
- Recoit un paramètre supplémentaire valid_tokens dans __init__ (un dictionnaire token vers nom d'utilisateur)
- Dans __call__, vérifie le header HTTP_AUTHORIZATION
- Si le header existe et commence par 'Token ', extrait le token et cherche dans valid_tokens
- Si le token est valide, ajoute request.user_name avec le nom d'utilisateur et request.is_authenticated = True
- Si le token est invalide ou absent, ajoute request.is_authenticated = False
- Dans tous les cas, continue la chaine et retourne la réponse

Exemple :

tokens = {'abc123': 'alice', 'def456': 'bob'}
mw = TokenAuthMiddleware(lambda r: HttpResponse('ok'), tokens)
req = HttpRequest()
req.META['HTTP_AUTHORIZATION'] = 'Token abc123'
mw(req)
req.user_name vaut 'alice' et req.is_authenticated vaut True

Tests (3/4)

Token valide
tokens = {'abc123': 'alice'}
mw = TokenAuthMiddleware(lambda r: HttpResponse('ok'), tokens)
req = HttpRequest()
req.META['HTTP_AUTHORIZATION'] = 'Token abc123'
mw(req)
assert req.is_authenticated == True and req.user_name == 'alice'
Token invalide
tokens = {'abc123': 'alice'}
mw = TokenAuthMiddleware(lambda r: HttpResponse('ok'), tokens)
req = HttpRequest()
req.META['HTTP_AUTHORIZATION'] = 'Token faux'
mw(req)
assert req.is_authenticated == False
Pas de header
mw = TokenAuthMiddleware(lambda r: HttpResponse('ok'), {})
req = HttpRequest()
mw(req)
assert req.is_authenticated == False

+ 0 tests cachés

Indices (3 disponibles)

solution.py