![](/img/trans.png)
[英]How to secure APIs for Registration and Login in Django Rest Framework?
[英]Django Rest Framework not login after registration
我在Django上有一個網站,並且有自定義的用戶模型。 在我使用Django Forms的網站上,我可以注冊並登錄后再使用,效果很好。 然后,我開始使用DRF和Django-rest-auth。 在設置中為其寫了路徑之后,我編寫了一個自定義寄存器序列化器。
from rest_framework import serializers
from ideas.models import Post, Unit, StatusOfPost
from accounts.models import User
from django.contrib.auth import authenticate
from django.contrib.auth import get_user_model
from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
class RegisterSerializer(serializers.Serializer):
phone_number = serializers.CharField(required=True, write_only=True)
username = serializers.CharField(required=True, write_only=True)
email = serializers.CharField(required=True, write_only=True)
first_name = serializers.CharField(required=True, write_only=True)
last_name = serializers.CharField(required=True, write_only=True)
password1 = serializers.CharField(required=True, write_only=True)
password2 = serializers.CharField(required=True, write_only=True)
def get_cleaned_data(self):
return {
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'address': self.validated_data.get('address', ''),
'username': self.validated_data.get('username', ''),
'password': self.validated_data.get('password', ''),
'email': self.validated_data.get('email', ''),
'phone_number': self.validated_data.get('phone_number',''),
}
def validate_email(self, email):
email = get_adapter().clean_email(email)
if allauth_settings.UNIQUE_EMAIL:
if email and email_address_exists(email):
raise serializers.ValidationError(
("A user is already registered with this e-mail address."))
return email
def validate_username(self, username):
username = get_adapter().clean_username(username)
return username
def validate_password1(self, password):
return get_adapter().clean_password(password)
def validate(self, data):
if data['password1'] != data['password2']:
raise serializers.ValidationError(
("The two password fields didn't match."))
return data
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.phone_number = self.cleaned_data.get('phone_number')
user.save()
return user
而且它也可以正常工作並創建一個新用戶,並向我返回一個令牌。 我的管理員中有一個新用戶。 但是,如果我想像這個新用戶一樣登錄我的網站,則該網站會告訴我該用戶名或密碼無效。 而且我不明白為什么,在我的管理員中我看到了這個用戶,並且我知道我寫了一個有效的密碼(我試圖創建其他用戶,但是結果是一個)
我注意到在我的管理員中,新用戶的密碼未編碼為在網站上注冊時的密碼。
進行比較:
通過API注冊后的編碼密碼
!Z2Aw4VpN34JidaSNmODVi5MJKRJHTgx0gfROnylA
在網站上注冊后的編碼密碼:
pbkdf2_sha256$100000$aILnGtv6ClxI$KVg1lwjSKf0REZI/M85i2tN/mTUTLxngNVwo4YaCe08=
可能是個問題,如果有的話,那怎么解決呢? 我不知道。
謝謝大家
在函數get_cleaned_data中刪除
'password': self.validated_data.get('password', ''),
並插入
'password1': self.validated_data.get('password1', ''),
'password2': self.validated_data.get('password2', ''),
它解決了我的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.