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测试,排除前端请求格式问题:
如果返回200,说明后端逻辑正常,检查前端是否正确设置请求头和参数。curl -X POST -H "Content-Type: application/json" -d '{"email": "registered-user@example.com"}' http://localhost:8000/auth/users/reset_password
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
相关产品推荐
相关产品推荐

