当前位置: 首页 > news >正文

Djoser 详解

1. 什么是 Djoser

Djoser 是一个基于 Django REST framework 的第三方库,它为常见的用户认证功能提供了开箱即用的 RESTful 接口,比如注册、登录、注销、密码重置、账户激活、令牌刷新等。

它主要目的是减少你手写视图和序列化器的工作量,并且与 TokenAuth、JWT(如 simplejwt)集成良好。

适用场景:

  • 基于 DRF 的后端 API 项目
  • 不想自己编写大量注册、登录、找回密码逻辑
  • 需要对用户认证进行自定义扩展

2. 主要特性

特性Djoser 是否支持
注册与登录、注销✅ 支持
邮箱激活✅ 支持
密码重置/修改✅ 支持
用户信息管理✅ 支持
支持自定义用户模型✅ 支持
RESTful API✅ 支持
Token / JWT 支持✅ 支持
支持社交媒体登录✅ 支持
几乎所有方面都可以自定义✅ 支持

3. 安装与配置

安装

pip install djoser

如果你打算使用 JWT 登录方式,还需要安装:

pip install djangorestframework-simplejwt

基本配置

Djoser 支持两种 Token 认证方式:

  1. 传统 Token(不推荐)
    REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication',],
    }
    
  2. JWT(推荐,支持 Token 刷新、验证,安全性更高。)
    REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication',],
    }
    

settings.py 中添加:

INSTALLED_APPS = [...'rest_framework','rest_framework.authtoken',  # 如果需要使用token认证'djoser',...
]REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication',  # token认证# 或者使用JWT# 'rest_framework_simplejwt.authentication.JWTAuthentication',),
}

URL 配置

urls.py 中:

from django.urls import path, includeurlpatterns = [...path('auth/', include('djoser.urls')),path('auth/', include('djoser.urls.authtoken')),  # 如果使用token认证# 或者使用JWT# path('auth/', include('djoser.urls.jwt')),...
]

4. 主要端点

Djoser 提供了一系列 RESTful 端点:

用户管理

  • /users/ - POST: 注册新用户
  • /users/me/ - GET, PUT, PATCH: 获取/更新当前用户信息
  • /users/{id}/ - GET: 获取特定用户信息

认证

  • /token/login/ - POST: 获取认证令牌(登录)
  • /token/logout/ - POST: 注销(使令牌失效)

密码管理

  • /users/set_password/ - POST: 更改密码
  • /users/reset_password/ - POST: 请求密码重置
  • /users/reset_password_confirm/ - POST: 确认密码重置

激活

  • /users/activation/ - POST: 激活用户账户
  • /users/resend_activation/ - POST: 重新发送激活邮件

5. 自定义设置

Djoser 提供了丰富的配置选项,可以在 settings.py 中自定义:

DJOSER = {# -------------------------------------------------------------------# 1. 核心认证配置# -------------------------------------------------------------------'LOGIN_FIELD': 'email',               # 使用email作为登录字段(替代username)'USER_CREATE_PASSWORD_RETYPE': True,  # 注册时需二次确认密码'SET_PASSWORD_RETYPE': True,          # 修改密码时需二次确认'LOGOUT_ON_PASSWORD_CHANGE': True,    # 修改密码后自动登出'PASSWORD_CHANGED_EMAIL_CONFIRMATION': True,  # 密码修改后发送确认邮件# -------------------------------------------------------------------# 2. 用户数据序列化器配置# -------------------------------------------------------------------'SERIALIZERS': {# 用户注册序列化器(需自定义)'user_create': 'accounts.serializers.CustomUserCreateSerializer',# 普通用户数据序列化器'user': 'accounts.serializers.CustomUserSerializer',# 当前用户数据序列化器'current_user': 'accounts.serializers.CustomUserDetailSerializer',# 密码重置序列化器(可选自定义)'password_reset': 'djoser.serializers.PasswordResetSerializer',},# -------------------------------------------------------------------# 3. 权限控制# -------------------------------------------------------------------'PERMISSIONS': {# 用户列表权限(仅管理员)'user_list': ['rest_framework.permissions.IsAdminUser'],# 用户详情权限(用户自己或管理员)'user': ['rest_framework.permissions.IsAuthenticatedOrReadOnly'],# 用户删除权限(仅管理员)'user_delete': ['rest_framework.permissions.IsAdminUser'],# 密码重置权限(允许任何用户)'password_reset': ['rest_framework.permissions.AllowAny'],},# -------------------------------------------------------------------# 4. 邮件相关配置# -------------------------------------------------------------------'SEND_ACTIVATION_EMAIL': True,       # 启用注册激活邮件'SEND_CONFIRMATION_EMAIL': True,     # 注册成功后发送欢迎邮件'ACTIVATION_URL': 'auth/activate/{uid}/{token}',       # 激活链接格式(需与前端路由匹配)'PASSWORD_RESET_CONFIRM_URL': 'auth/password/reset/{uid}/{token}',  # 密码重置链接# 邮件主题和模板配置(可选自定义)'EMAIL': {'activation': 'accounts.email.ActivationEmail','confirmation': 'accounts.email.ConfirmationEmail','password_reset': 'accounts.email.PasswordResetEmail',},# -------------------------------------------------------------------# 5. 安全与令牌配置# -------------------------------------------------------------------'TOKEN_MODEL': None,  # 使用DRF默认Token(推荐使用JWT)# 如果使用JWT,需添加以下配置:# 'JWT_AUTH': {#     'JWT_ALLOW_REFRESH': True,#     'JWT_EXPIRATION_DELTA': timedelta(days=1),# },'HIDE_USERS': True,  # 隐藏用户列表接口中的非管理员用户# -------------------------------------------------------------------# 6. 其他实用配置# -------------------------------------------------------------------'USER_ID_FIELD': 'id',  # 用户主键字段'SOCIAL_AUTH_ALLOWED_REDIRECT_URIS': [  # 社交登录允许的重定向URI'http://localhost:3000/auth/google','https://yourdomain.com/auth/facebook'],# 用户名相关配置(如果使用username)# 'USERNAME_RESET_CONFIRM_URL': 'auth/username/reset/{uid}/{token}',# 'USERNAME_CHANGED_EMAIL_CONFIRMATION': True,
}

6. 与 JWT 集成

如果需要使用 JWT 而不是默认的 Token 认证:

  1. 安装所需包:
pip install djangorestframework-simplejwt
  1. 修改 settings.py
REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',),
}
  1. 修改 urls.py
urlpatterns = [...path('auth/', include('djoser.urls.jwt')),...
]

7. 使用示例

注册用户

POST /auth/users/
Content-Type: application/json{"username": "newuser","password": "strongpassword123","email": "newuser@example.com"
}

登录获取令牌

POST /auth/token/login/
Content-Type: application/json{"username": "newuser","password": "strongpassword123"
}POST /auth/jwt/create/
Content-Type: application/json{"email": "user@example.com",  # 使用 LOGIN_FIELD 指定的字段(默认是 email)"password": "strongpassword123"
}

响应:

{"auth_token": "9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"
}{"refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

访问受保护资源

GET /api/protected/
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

8. 高级功能

自定义用户模型(推荐)

建议在项目中使用自定义用户模型:

# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import modelsclass CustomUser(AbstractUser):email = models.EmailField(unique=True)USERNAME_FIELD = 'email'REQUIRED_FIELDS = ['username']

在 settings.py 设置:

AUTH_USER_MODEL = 'accounts.CustomUser'

自定义序列化器

你可以通过修改 DJOSER[‘SERIALIZERS’] 来扩展字段:

# accounts/serializers.py
from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from djoser.serializers import UserSerializer as BaseUserSerializerclass CustomUserCreateSerializer(BaseUserCreateSerializer):class Meta(BaseUserCreateSerializer.Meta):fields = ('id', 'email', 'username', 'password')class CustomUserSerializer(BaseUserSerializer):class Meta(BaseUserSerializer.Meta):fields = ('id', 'email', 'username')

然后在设置中指定:

DJOSER = {'SERIALIZERS': {'user_create': 'myapp.serializers.CustomUserCreateSerializer',}
}

自定义权限

DJOSER = {'PERMISSIONS': {'user_list': ['rest_framework.permissions.IsAdminUser'],'user': ['rest_framework.permissions.IsAuthenticated'],}
}

电子邮件模板

可以自定义各种电子邮件模板:

DJOSER = {'EMAIL': {'activation': 'myapp.email.ActivationEmail','password_reset': 'myapp.email.PasswordResetEmail',}
}

9. 常见问题解决

邮箱激活

# 必须配置
SEND_ACTIVATION_EMAIL = True
ACTIVATION_URL = 'your-frontend-route/{uid}/{token}'  # 前端需要处理该路由,展示对应的激活/重置页面# 推荐配置
EMAIL_TIMEOUT = 10  # 邮件发送超时设置
DEFAULT_FROM_EMAIL = 'noreply@yourdomain.com'  # 发件人地址

测试:

# 测试邮件发送
python manage.py sendtestmail user@example.com# 测试激活链接
curl -X POST http://localhost:8000/auth/users/activation/ -d 'uid=XXX&token=XXX'

密码重置

  1. 确保启用:
    'SEND_CONFIRMATION_EMAIL': True,
    'PASSWORD_RESET_CONFIRM_URL': 'password-reset/{uid}/{token}',
    
  2. 前端需要实现对应路由的页面

用户模型问题

  • 自定义用户模型不工作
    1. 确认 AUTH_USER_MODEL 已正确设置
    2. 检查序列化器继承关系:
      from djoser.serializers import UserCreateSerializer
      class CustomUserCreateSerializer(UserCreateSerializer):class Meta(UserCreateSerializer.Meta):fields = ['id', 'email', 'name', 'password']
      

10. 实践建议

  1. 统一认证方式:优先使用 JWT(SimpleJWT)。

  2. 自定义序列化器:始终为自定义用户模型指定序列化器。

  3. 测试邮件服务:部署前务必测试邮件发送功能。

  4. 安全建议

    • 生产环境务必使用HTTPS
    • 合理设置密码强度要求
    • 优先使用 JWT,JWT应设置合理的过期时间
    • 限制登录尝试次数以防止暴力破解
    • 定期轮换敏感密钥(特别是使用 JWT 时)
  5. 推荐组合

    功能
    后端框架Django + DRF
    用户认证Djoser
    Token认证方式simplejwt
    邮件发送SMTP / Mailgun
    前端交互Vue / React

总结

Djoser 为 Django REST Framework 项目提供了一个强大且灵活的身份验证解决方案,可以大大减少开发时间。通过合理的配置和自定义,它可以满足大多数项目的认证需求,同时保持代码的整洁和可维护性。

http://www.dtcms.com/a/291263.html

相关文章:

  • 深度学习中的数据增强:从理论到实践
  • hot100回归复习(算法总结1-38)
  • 力扣面试150(35/150)
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • Excel函数 —— XLOOKUP 双向查找
  • Linux find命令:强大的文件搜索工具
  • 计算机发展史:电子管时代的辉煌与局限
  • 无人机浆叶安装顺序
  • 【算法基础】二分查找
  • 源码编译安装boost库,以及卸载boost库
  • 插值法的使用
  • Js进阶案例合集
  • iostat的使用说明
  • 基于深度学习的图像分类:使用ResNet实现高效分类
  • (10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操
  • G7打卡——Semi-Supervised GAN
  • numpy库的基础知识
  • 【VASP】机器学习势概述
  • 5G/4G PHY SoC:RNS802,适用于集成和分解的小型蜂窝 RAN 架构。
  • 在github上搭建自己主页
  • Blender软件入门-了解软件界面
  • JS逆向 - 滴滴(dd03、dd05)WSGSIG
  • Webpack源代码泄露漏洞
  • 云原生技术与应用-Kubernetes Pod调度基础
  • 热室机械手市场报告:智能装备推动高温制造自动化升级
  • 【推荐系统】推荐系统常用数据集介绍
  • 【系统全面】linux基础以及命令——基础知识介绍
  • stm32内存分析
  • ZYNQ硬核操作:免IIC驱动直控MCP4661T数字电位器
  • python实现接收九数云的异常分析指标推送通知