You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Djoser重置密码接口返回403 Forbidden问题求助

解决Djoser重置密码端点403 Forbidden问题

看起来你的核心问题出在全局权限配置上,结合你提供的settings代码,我来一步步帮你排查:

1. 定位403的根本原因

你的REST_FRAMEWORK配置里,DEFAULT_PERMISSION_CLASSES同时设置了两个权限类:

'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    'rest_framework.permissions.IsAuthenticated',
]

这两个权限是逻辑与的关系——请求必须同时满足所有权限才能通过。而IsAuthenticated要求用户必须登录,但重置密码的场景下,用户恰恰是未登录的匿名状态,所以直接触发了403禁止访问。

2. 修复权限配置

你有两种方案可选,根据你的业务需求来:

方案A:调整全局默认权限(推荐)

如果你的大部分API需要认证,但像重置密码、注册这类开放端点允许匿名访问,建议去掉IsAuthenticated,保留DjangoModelPermissionsOrAnonReadOnly:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': ( 
        'rest_framework_simplejwt.authentication.JWTAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': [ 
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', 
    ] 
}

DjangoModelPermissionsOrAnonReadOnly会让匿名用户只能访问只读接口,但Djoser的重置密码POST接口已经内置了允许匿名访问的权限配置,所以这个调整不会影响它的正常工作。

方案B:给Djoser视图单独配置权限

如果你必须保留全局的IsAuthenticated,可以在urls.py中覆盖Djoser重置密码视图的权限:

from django.urls import path, include
from djoser.views import PasswordResetView
from rest_framework.permissions import AllowAny

urlpatterns = [
    # 这个路由要放在include('djoser.urls')之前才能覆盖默认配置
    path('auth/users/reset_password/', PasswordResetView.as_view(permission_classes=[AllowAny]), name='password_reset'),
    path('auth/', include('djoser.urls')),
    path('auth/', include('djoser.urls.jwt')),
]

3. 排查邮件发送问题(权限修复后仍需确认)

如果权限修复后还是没收到邮件,检查以下几点:

  • 邮件配置是否完整:在settings.py中添加SMTP配置(以Gmail为例):
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_PORT = 587
    EMAIL_HOST_USER = 'your-email@gmail.com'
    EMAIL_HOST_PASSWORD = 'your-app-specific-password'  # 注意是应用密码,不是邮箱登录密码
    EMAIL_USE_TLS = True
    DEFAULT_FROM_EMAIL = 'your-email@gmail.com'
    
  • 用户邮箱是否存在:确保你发送请求的邮箱在系统中已注册
  • 测试后端直接请求:用curl或Postman测试,排除前端请求格式问题:
    curl -X POST -H "Content-Type: application/json" -d '{"email": "registered-user@example.com"}' http://localhost:8000/auth/users/reset_password
    
    如果返回200,说明后端逻辑正常,检查前端是否正确设置请求头和参数。

4. 额外检查点

  • 确认你的AUTH_USER_MODEL已正确配置(如果自定义了用户模型):
    AUTH_USER_MODEL = 'authentication.User'  # 根据你的实际app和模型名调整
    
  • 确认Djoser的URL已正确包含在项目urls.py中:
    path('auth/', include('djoser.urls')),
    path('auth/', include('djoser.urls.jwt')),
    

按这个步骤排查,应该能解决你的403和邮件发送问题。

内容的提问来源于stack exchange,提问作者Omar Redwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:38:56