簡體   English   中英

使用 Djoser 和 Django Rest Framework 激活帳戶

[英]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 的電子郵件,這有我們需要的兩個重要信息, uidtoken

可以通過ACTIVATION_URL設置更改電子郵件中此 URL 的形成方式: "ACTIVATION_URL": "auth/request_activate/{uid}/{token}",就我而言。

/{uid}/{token}表示我們可以在鏈接指向的視圖中使用uidtoken

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)

正如您所看到的,視圖函數接收uidtoken作為參數,然后使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM