如何在Django应用中使用外部身份认证并关联数据模型
基于第三方Web Service的Django身份认证实现方案
整体运行逻辑
- 用户在前端提交身份凭证(账号密码、授权码等)到你的Django后端
- 后端不做本地凭证校验,直接按第三方Web Service要求的格式封装请求,调用对方的认证接口
- 解析第三方接口返回结果:
- 认证失败:直接返回错误提示给前端
- 认证成功:拿到第三方返回的唯一用户标识、用户公开信息(昵称、邮箱等),本地生成会话凭证(JWT、SessionID均可)返回给前端,后续用户请求携带该凭证即可完成本地鉴权
本地用户数据存储实现
不用Django内置auth模块的情况下,你可以自定义独立的用户模型存储关联信息,示例代码如下:
from django.db import models class ExternalAuthUser(models.Model): # 第三方Web Service返回的唯一用户ID,必须加唯一约束和索引,作为用户的关联依据 external_uid = models.CharField(max_length=64, unique=True, db_index=True) # 第三方返回的用户基础字段,按需扩展 nickname = models.CharField(max_length=32, null=True, blank=True) email = models.EmailField(null=True, blank=True) # 本地业务需要的额外用户字段 created_at = models.DateTimeField(auto_now_add=True) last_active_at = models.DateTimeField(auto_now=True) class Meta: db_table = "external_auth_user"
每次用户认证成功后,先通过返回的external_uid查询本地表:不存在则新建用户记录,存在则更新第三方返回的最新用户信息即可。
外键关联用户与其他业务模型(以帖子为例)
其他需要关联用户的业务模型,直接通过外键指向你自定义的ExternalAuthUser模型即可,帖子模型示例:
class UserPost(models.Model): title = models.CharField(max_length=128) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) # 外键关联自定义用户模型,on_delete规则可根据业务需求调整为PROTECT/SET_NULL等 author = models.ForeignKey( ExternalAuthUser, on_delete=models.CASCADE, related_name="my_posts", db_index=True ) class Meta: db_table = "user_post"
关联操作示例:
- 获取指定用户的所有帖子:
user_instance.my_posts.all() - 获取指定帖子的作者信息:
post_instance.author.nickname
如果需要适配原Django的使用习惯,可以自定义一个请求中间件,每次请求解析会话凭证拿到external_uid,查询出对应的ExternalAuthUser实例挂载到request.user上,后续视图层可以直接调用使用。
内容的提问来源于stack exchange,提问作者Rihab sabri
相关产品推荐
相关产品推荐

