Exercices Django Avancé Token Authentication simulee
🎉

Bravo!

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

Token Authentication simulee

Si tu as deja utilise un service comme Stripe, GitHub ou Slack via leur API, tu as forcement manipule un token d'authentification. C'est le standard des APIs modernes. Le principe : quand un utilisateur se connecte, le serveur lui donne un token unique. A chaque requete suivante, le client envoie ce token dans un header HTTP, et le serveur verifie a qui il appartient.

C'est comme un badge d'acces dans un immeuble de bureaux. Tu le montres a l'entree, le vigile le scanne, et il sait qui tu es.

Dans DRF, le header ressemble a : Authorization: Token abc123def456

Tu vas créer une classe TokenAuth qui :

generate_token(user_id) : génère un token unique pour un utilisateur (utilise le module secrets : secrets.token_hex(16) donne une chaine hexadecimale de 32 caracteres). Stocke l'association token vers user_id dans un dictionnaire interne self.tokens. Retourne le token.

authenticate(header) : recoit la valeur du header Authorization (ex: 'Token abc123'). Vérifie que le header commence par 'Token ', extrait le token, et retourne le user_id associe. Retourne None si le token est invalide ou absent.

revoke_token(token) : supprime un token (deconnexion). Retourne True si le token existait, False sinon.

Exemple :

auth = TokenAuth()
token = auth.generate_token('alice')
auth.authenticate(f'Token {token}') renvoie 'alice'
auth.authenticate('Token faux_token') renvoie None

Tests (4/5)

Générer un token
auth = TokenAuth()
token = auth.generate_token('alice')
assert isinstance(token, str) and len(token) == 32
Authentifier un token valide
auth = TokenAuth()
token = auth.generate_token('alice')
assert auth.authenticate(f'Token {token}') == 'alice'
Token invalide
auth = TokenAuth()
assert auth.authenticate('Token faux') is None
assert auth.authenticate('') is None
assert auth.authenticate('Bearer abc') is None
Revoquer un token
auth = TokenAuth()
token = auth.generate_token('bob')
assert auth.revoke_token(token) == True
assert auth.authenticate(f'Token {token}') is None

+ 0 tests cachés

Indices (3 disponibles)

solution.py