我在我的项目中使用Djoser进行身份验证。 到目前为止,一直在努力添加电子邮件激活功能已超过4天,但由于文档难以理解,因此似乎无法很好地掌握它。
这是我的代码 settings.py
#change auth model to custom model
AUTH_USER_MODEL = 'userauth.User'
#setting up email server
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'okumujustine01@gmail.com'
EMAIL_HOST_PASSWORD = 'codemanuzmaster'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'okumujustine01@gmail.com'
#djoser login settings
DJOSER = {
'DOMAIN': 'localhost:8000',
'SITE_NAME': 'net',
'LOGIN_FIELD':'email',
'USER_CREATE_PASSWORD_RETYPE':True,
'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
'SEND_ACTIVATION_EMAIL': True,
'SERIALIZERS':{
'user_create':'userauth.serializers.UserCreateSerializer',
'user':'userauth.serializers.UserCreateSerializer',
'activation': 'djoser.email.ActivationEmail',
}
}
这是我在创建用户后收到的电子邮件
http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d
它显示 example.com ,但我希望它将网址更改为 localhost:8000
您收到此电子邮件是因为您需要在example.com上完成激活过程。
请转到以下页面激活帐户:
http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d
如果我将网址手动更改为
http://127.0.0.1:8000/users/activate/MQ/5c9-26bcab9e85e8a967731d
它不断返回
{
"detail": "Authentication credentials were not provided."
}
我真的要求你们帮助我。
答案 0 :(得分:1)
要回答您的原始问题(如何为激活URL使用不同的域),您需要从Djoser设置中删除DOMAIN和SITE_NAME。示例:
DOMAIN = config('DOMAIN') #localhost:8000
SITE_NAME = config('SITE_NAME') #net
DJOSER = {
'LOGIN_FIELD':'email',
'USER_CREATE_PASSWORD_RETYPE':True,
'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
'SEND_ACTIVATION_EMAIL': True,
'SERIALIZERS':{
'user_create':'userauth.serializers.UserCreateSerializer',
'user':'userauth.serializers.UserCreateSerializer',
'activation': 'djoser.email.ActivationEmail',
}
然后,您应该在电子邮件中获得下一个链接:
http://localhost:8000/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d
答案 1 :(得分:0)
我已经使用下面的答案https://stackoverflow.com/a/47159919/8110396
我可能正在解释您已经了解的事情,但这可能会帮助其他人了解这种情况的进展。
查看User Activation上的Djoser文档,它说:“此端点不是直接向您的用户公开的URL”,
这意味着使用的链接不会提供给注册人员,您在电子邮件中获得的链接需要激活一些代码,这些代码将执行对Django视图的调用,从而激活用户的电子邮件。
我想您可以从前端执行这两个操作,在前端,一些JavaScript使用fetch / axios会调用电子邮件激活视图。但是,也可以通过使Django视图包含将调用电子邮件激活视图的代码来实现。
因此,基本上,电子邮件链接将触发代码(JS / Python),该代码将向Django视图发送http发布请求。
我不知道最佳选择是什么,但是此解决方案将全部通过Django进行。
基本流程是这样:
1个用户注册
2用户正在发送带有URL的电子邮件,其中包含我们需要的两个重要信息,uid
和token
。
可以通过ACTIVATION_URL
设置更改电子邮件中此URL的格式:在我的情况下为"ACTIVATION_URL": "auth/request_activate/{uid}/{token}",
。
/{uid}/{token}
意味着我们可以在链接指向的视图中使用uid
和token
。
3此链接会导致执行用户激活的Django视图
views.py
:
from rest_framework import permissions
from rest_framework.decorators import (
api_view,
permission_classes,
)
from rest_framework.response import Response
from rest_framework.views import APIView
import requests
@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def request_user_activation(request, uid, token):
"""
Intermediate view to activate a user's email.
"""
post_url = "http://127.0.0.1:8000/djoser_auth/users/activation/"
post_data = {"uid": uid, "token": token}
result = requests.post(post_url, data=post_data)
content = result.text
return Response(content)
如您所见,视图函数接收uid
和token
作为参数,然后使用{{1}在POST请求中将其发送到实际(Djoser
)视图}}库。
requests
是Djoser文档中提到的用于激活电子邮件的post_url
:Default URL
(您可能会发现较旧的网址/users/activation/
,请不要使用那是行不通的;))。
请注意,我的网址中有/users/activate/
,其中的默认值仅为djoser_auth
,我不会继续讲究为什么,但这是我的主要auth
:
urls.py
还有我的from django.urls import include, path
urlpatterns = [
...
path("auth/", include("authentication.urls")),
...
path("djoser_auth/", include("djoser.urls")),
path("djoser_auth/", include("djoser.urls.jwt")),
]
:
settings.py
因此,使用它,您应该能够单击电子邮件中的链接,并且您的用户在管理员中选中了DJOSER = {
"ACTIVATION_URL": "auth/request_activate/{uid}/{token}",
"SEND_ACTIVATION_EMAIL": True,
"SERIALIZERS": {},
"USER_CREATE_PASSWORD_RETYPE": True,
}
复选框。