如何解决尽管我在 django rest-frame work 中发送了由视图生成的正确令牌,但令牌验证失败
以前它运行良好,可以验证我的令牌,但是,我不知道发生了什么,它总是将我返回为无效的令牌。
使用 /register 并发送电子邮件以使用这些代码进行验证。
view.py
class RegisterView(generics.GenericAPIView) :
serializer_class = RegisterSerializer
renderer_classes = (UserRenderer,)
def post(self,request) :
user = request.data
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True)
serializer.save()
user_data = serializer.data
user = User.objects.get(email=user_data['email'])
token = RefreshToken.for_user(user).access_token
current_site = get_current_site(request).domain
relativeLink = reverse('email-verify')
absurl = 'http://' + current_site + relativeLink + "?token=" + str(token)
email_body = 'Hi ' + user.username + \
' Use the link below to verify your email \n' + absurl
data = {
'email_body' : email_body,'to_email' : user.email,'email_subject' : 'Verify your email'
}
Util.send_email(data)
return Response(user_data,status=status.HTTP_201_CREATED)
serializers.py
class RegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=68,min_length=6,write_only=True)
default_error_messages = {
'username': 'The username should only contain alphanumeric characters'}
class Meta:
model = User
fields = ['email','username','password']
def validate(self,attrs):
email = attrs.get('email','')
username = attrs.get('username','')
if not username.isalnum():
raise serializers.ValidationError(
self.default_error_messages)
return attrs
def create(self,validated_data):
return User.objects.create_user(**validated_data)
urls.py
path('register/',RegisterView.as_view(),name="register"),
utils.py
from django.core.mail import EmailMessage
import threading
class EmailThread(threading.Thread):
def __init__(self,email):
self.email = email
threading.Thread.__init__(self)
def run(self):
self.email.send()
class Util:
@staticmethod
def send_email(data):
email = EmailMessage(
subject=data['email_subject'],body=data['email_body'],to=[data['to_email']])
EmailThread(email).start()
现在我想通过向它提供令牌来验证使用 /email-verify 发送到电子邮件的令牌。
下面是代码。
view.py
class VerifyEmail(views.APIView):
serializer_class = EmailVerificationSerializer
token_param_config = openapi.Parameter(
'token',in_=openapi.IN_QUERY,description='Description',type=openapi.TYPE_STRING)
@swagger_auto_schema(manual_parameters=[token_param_config])
def get(self,request):
token = request.GET.get('token')
try:
payload = jwt.decode(token,settings.SECRET_KEY)
user = User.objects.get(id=payload['user_id'])
if not user.is_verified :
user.is_verified = True
user.save()
return Response({
'email' : 'Successfully activated'
},status=status.HTTP_200_OK)
except jwt.ExpiredSignatureError as identifier :
return Response({
'error' : 'Activation Expired'
},status=status.HTTP_400_BAD_REQUEST)
except jwt.exceptions.DecodeError as identifier :
return Response({
'error' : 'Invalid token'
},status=status.HTTP_400_BAD_REQUEST)
serializers.py
class EmailVerificationSerializer(serializers.ModelSerializer):
token = serializers.CharField(max_length=555)
class Meta:
model = User
fields = ['token']
urls.py
path('email-verify/',VerifyEmail.as_view(),name="email-verify"),
问题是,虽然我提供了发送到电子邮件的有效令牌 tp /verify-email,但它返回了一个无效令牌作为响应。为什么会发生。有人能看到代码中的任何问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。