freeCodeCamp.org

如何使用 Django REST Framework 和 SimpleJWT 构建带作用域的笔记 API

8.7内容质量
如何使用 Django REST Framework 和 SimpleJWT 构建带作用域的笔记 API

TL;DR · AI 摘要

本文详解如何用 Django REST Framework 和 SimpleJWT 构建带作用域控制的笔记 API,重点解决跨域场景下 JWT 替代 Session 的认证方案及用户数据隔离(scoping)机制。

核心要点

  • JWT 提供无状态、跨域友好的认证方式,避免 Cookie 跨域失效问题
  • 通过自定义 User 模型 + DRF 权限类 + 查询集过滤实现严格的数据作用域隔离
  • scoped 视图需在 queryset 层级强制绑定 request.user,而非仅依赖权限装饰器

结构提纲

按章节快速跳转。

  1. 指出传统 Session 认证在前后端分离架构中因 Cookie 跨域限制而失效。

  2. ·JWT 的优势与工作原理

    对比 Session 与 JWT 的状态管理、传输方式和跨域兼容性。

  3. 强调数据隔离不仅是权限检查,更需在 QuerySet 层强制过滤属主。

  4. 涵盖虚拟环境、DRFSimpleJWT 安装及基础 settings 配置。

  5. 扩展 AbstractBaseUser,支持邮箱登录并注册为 AUTH_USER_MODEL。

  6. 使用 get_queryset() 动态过滤 request.user 的 Note 对象,确保零越权访问。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Scoped Note-Taking API
    • Authentication
      • Session Auth → breaks cross-domain
      • JWT → stateless, signed, domain-agnostic
    • Scoping Mechanism
      • Custom User Model
      • QuerySet-level filtering (get_queryset)
      • SimpleJWT integration
    • Security Guarantees
      • No ID guessing leaks
      • No shared session state
      • Strict per-user data isolation

金句 / Highlights

值得收藏与分享的关键句。

  • Cookies don't travel well across different domains, and suddenly your login system stops working.

    Introduction

    ⬇︎ 下载 PNG𝕏 分享到 X
  • The server doesn't need to remember anything. It just verifies the token's signature and knows exactly who's making the request.

    What is JWT section

    ⬇︎ 下载 PNG𝕏 分享到 X
  • Scoping means ensuring that each user can only access their own data. User A should never be able to read, edit, or delete User B's data (notes in our case), even if they somehow guess the right ID.

    Scoping definition

    ⬇︎ 下载 PNG𝕏 分享到 X
  • You'll implement a custom user model, configure SimpleJWT for token-based authentication, and write scoped views that lock each user's data behind their own credentials.

    Tutorial overview

    ⬇︎ 下载 PNG𝕏 分享到 X
#Django#DRF#JWT#API 安全#后端
打开原文
Image 1: How to Build a Scoped Note-Taking API with Django Rest Framework and SimpleJWT
Image 1: How to Build a Scoped Note-Taking API with Django Rest Framework and SimpleJWT

如果你已经构建过 Django API,并想知道如何添加身份验证,使每个用户只能访问自己的数据,那么你来对地方了。

大多数 Django 教程教授的是基于会话的身份验证。当你的前端和后端部署在同一台服务器上时,这种方式运行良好。但一旦你将它们分离——例如,一个部署在 Netlify 上的 React 应用与部署在 PythonAnywhere 上的 Django API 通信——会话机制就会开始失效。

Cookie 在不同域名之间传输效果很差,你的登录系统随即崩溃。

这时,JSON Web Tokens(JWT)就派上用场了。JWT 提供了一种无状态、无需 Cookie 的用户认证方式,能无缝跨域名、设备和平台工作。服务器无需记忆任何内容,只需验证令牌的签名,就能准确知道是谁发起了请求。

但身份验证只是问题的一半。一旦你知道了用户是谁,你仍需控制他们能查看的内容。这就是作用域限制(scoping)发挥作用的地方。

作用域限制意味着确保每个用户只能访问自己的数据。用户 A 永远不应能够读取、编辑或删除用户 B 的数据(在我们这里就是笔记),即使他们偶然猜到了正确的 ID。

在本教程中,你将构建一个个人笔记 API,用户可以注册、使用 JWT 令牌登录,并存储只有他们自己才能访问的笔记。

在此过程中,你将实现自定义用户模型,配置 SimpleJWT 实现基于令牌的身份验证,并编写作用域视图,将每个用户的资料锁定在其自身凭证之后。

我们将涵盖的内容:

本教程涵盖以下内容:

  1. 如何设置自定义用户模型(以及为什么你应始终这样做)
  1. 如何配置 SimpleJWT 以实现访问令牌和刷新令牌认证
  1. 如何构建保护敏感字段的序列化器
  1. 如何为 API 视图设置作用域,使用户只能看到自己的数据
  1. 如何使用 Postman 测试整个流程

让我们开始吧!

先决条件

在开始之前,请确保你熟悉以下内容:

  1. Django 基础知识:你应该理解 Django 项目和应用的工作原理,包括模型、视图、URL 和迁移。
  1. Django REST Framework 基础:你应该熟悉序列化器、视图集或 API 视图,以及 DRF 如何处理请求和响应。
  1. 基本命令行操作:本教程中你将在终端中运行命令。

你需要安装的工具:

  • Python 3.8 或更高版本
  • pip(Python 的包管理器)
  • 代码编辑器,如 Visual Studio Code
  • Postman(或任何 API 测试工具)用于测试你的端点。你将使用它向 API 发送请求。

什么是 JWT,为什么选择它而不是会话认证?

在编写任何代码之前,理解 JWT 解决了什么问题,以及为什么 Django 内置的会话认证并不总是足够,是非常重要的。

会话认证的工作原理

Django 自带了一个基于会话的身份验证系统。其工作原理大致如下:

  1. 用户向服务器发送用户名和密码。
  1. 服务器验证凭据,并创建一个会话——这是一个存储在服务器数据库中的小记录,表示“此用户已登录”。
  1. 服务器将一个会话 ID作为 Cookie 返回。浏览器会自动存储此 Cookie。
  1. 在后续的每次请求中,浏览器都会将该 Cookie 发送回服务器。服务器在数据库中查找该会话 ID,并说:“啊,这是用户 A。放行。”

![Image 2: The infographics shows the steps taken in Django session authentication](https://cdn.hashnode.com/uploads/covers/69bdd408475ca179744595