Bien qu'il existe de nombreuses réponses à cette question, aucune d'entre elles (à l'heure où j'écris ces lignes) n'aborde le problème de sécurité essentiel, à savoir la validation du mot de passe définie dans le document settings.AUTH_PASSWORD_VALIDATORS
. Il est donc possible de créer un mot de passe comme '1'
ce qui ne doit pas être acceptable. J'ai donc corrigé ce problème de sécurité majeur. Voici ma solution :
Dans serializers.py :
from django.contrib.auth import get_user_model
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
class SignupSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ['username', 'first_name', 'last_name', 'email', 'password', ]
extra_kwargs = {
'password': {'write_only': True}
}
def validate_password(self, value):
validate_password(value)
return value
def create(self, validated_data):
user = get_user_model()(**validated_data)
user.set_password(validated_data['password'])
user.save()
return user
Dans views.py :
from rest_framework import mixins, viewsets
from rest_framework.permissions import AllowAny, IsAuthenticated
from . import forms, serializers
class SignupViewSet(mixins.CreateModelMixin,
viewsets.GenericViewSet):
permission_classes = [AllowAny]
serializer_class = serializers.SignupSerializer
Réponse de l'API :
Maintenant, si vous essayez avec un mot de passe simple comme '1'
cette réponse sera renvoyée automatiquement :
{
"password": [
"This password is too short. It must contain at least 8 characters.",
"This password is too common.",
"This password is entirely numeric."
]
}
Dans le cas d'un mot de passe comme '12345678'
la réponse est :
{
"password": [
"This password is too common.",
"This password is entirely numeric."
]
}
De cette façon, le client final saura exactement quelles sont les autres conditions requises pour que le mot de passe soit valide.