[英]Accounts activation with Djoser and Django Rest Framework
在我的項目中使用 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."
}
我真的請求你們幫助我。
要回答您的原始問題(如何為激活 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
我已經使用這個 SO 答案讓它工作了: 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
作為參數,然后使用requests
庫將它們以 POST 請求發送到實際 ( Djoser
) 視圖。
post_url
創建的post_url
是 Djoser 文檔中提到的作為電子郵件激活Default URL
: /users/activation/
(您可能會發現較舊的 url /users/activate/
,不要使用它,不會起作用;))。
請注意,我的 url 中有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
復選框。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.