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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:36:02