使用 Djoser 和 Django Rest Framework 激活帐户
Posted
技术标签:
【中文标题】使用 Djoser 和 Django Rest Framework 激活帐户【英文标题】:Accounts activation with Djoser and Django Rest Framework 【发布时间】:2020-04-07 15:34:43 【问题描述】:我在我的项目中使用 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,但我希望它改为将 web url 更改为 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."
我真的请求你们帮助我。
【问题讨论】:
你的 DRF 设置是什么? 你得到它的工作,我也得到“没有提供身份验证凭据。”目前,不知道为什么。但我会调查一下,可能很快就会分享一个解决方案。 【参考方案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
【讨论】:
【参考方案2】:我已经使用这个 SO 答案让它工作了:https://***.com/a/47159919/8110396
我可能会解释您已经了解的事情,但它可能会帮助其他人了解这是如何进行的。
查看User Activation 上的 Djoser 文档,它说“此端点不是将直接暴露给您的用户的 URL”,
这意味着所使用的链接不提供给注册的人,您在电子邮件中获得的链接需要激活一些代码,该代码将执行对激活用户电子邮件的 Django 视图的调用。
我想你可以从前端执行此操作,其中一些 javascript 使用 fetch/axios 将调用电子邮件激活视图。但也可以通过让 Django 视图包含调用电子邮件激活视图的代码来完成。
所以基本上,电子邮件链接将触发代码(JS/Python),该代码将向 Django 视图发送 http post 请求。
我不知道最好的选择是什么,但是这个解决方案都会通过 Django。
基本流程是这样的:
1 个用户注册
2 用户正在发送带有 URL 的电子邮件,其中包含我们需要的两个重要信息,uid
和 token
。
电子邮件中这个 URL 的形成方式可以通过 ACTIVATION_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
作为参数,然后使用 requests
库在 POST 请求中将其发送到实际 (Djoser
) 视图。
post_url
在此处创建是 Djoser 文档中提到的用于电子邮件激活的 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,
因此,使用它您应该能够单击电子邮件中的链接,并且您的用户在管理员中选中了is activated
复选框。
【讨论】:
以上是关于使用 Djoser 和 Django Rest Framework 激活帐户的主要内容,如果未能解决你的问题,请参考以下文章
DRF:如何将 django-rest-framework-jwt 集成到 Djoser
Django Rest Framework djoser 激活问题