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

TL;DR · AI 摘要
本文详解如何用 Django REST Framework 和 SimpleJWT 构建带作用域控制的笔记 API,重点解决跨域场景下 JWT 替代 Session 的认证方案及用户数据隔离(scoping)机制。
核心要点
- JWT 提供无状态、跨域友好的认证方式,避免 Cookie 跨域失效问题
- 通过自定义 User 模型 + DRF 权限类 + 查询集过滤实现严格的数据作用域隔离
- scoped 视图需在 queryset 层级强制绑定 request.user,而非仅依赖权限装饰器
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 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.
The server doesn't need to remember anything. It just verifies the token's signature and knows exactly who's making the request.
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.
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.

如果你已经构建过 Django API,并想知道如何添加身份验证,使每个用户只能访问自己的数据,那么你来对地方了。
大多数 Django 教程教授的是基于会话的身份验证。当你的前端和后端部署在同一台服务器上时,这种方式运行良好。但一旦你将它们分离——例如,一个部署在 Netlify 上的 React 应用与部署在 PythonAnywhere 上的 Django API 通信——会话机制就会开始失效。
Cookie 在不同域名之间传输效果很差,你的登录系统随即崩溃。
这时,JSON Web Tokens(JWT)就派上用场了。JWT 提供了一种无状态、无需 Cookie 的用户认证方式,能无缝跨域名、设备和平台工作。服务器无需记忆任何内容,只需验证令牌的签名,就能准确知道是谁发起了请求。
但身份验证只是问题的一半。一旦你知道了用户是谁,你仍需控制他们能查看的内容。这就是作用域限制(scoping)发挥作用的地方。
作用域限制意味着确保每个用户只能访问自己的数据。用户 A 永远不应能够读取、编辑或删除用户 B 的数据(在我们这里就是笔记),即使他们偶然猜到了正确的 ID。
在本教程中,你将构建一个个人笔记 API,用户可以注册、使用 JWT 令牌登录,并存储只有他们自己才能访问的笔记。
在此过程中,你将实现自定义用户模型,配置 SimpleJWT 实现基于令牌的身份验证,并编写作用域视图,将每个用户的资料锁定在其自身凭证之后。
我们将涵盖的内容:
本教程涵盖以下内容:
- 如何设置自定义用户模型(以及为什么你应始终这样做)
- 如何配置 SimpleJWT 以实现访问令牌和刷新令牌认证
- 如何构建保护敏感字段的序列化器
- 如何为 API 视图设置作用域,使用户只能看到自己的数据
- 如何使用 Postman 测试整个流程
让我们开始吧!
先决条件
在开始之前,请确保你熟悉以下内容:
- Django 基础知识:你应该理解 Django 项目和应用的工作原理,包括模型、视图、URL 和迁移。
- Django REST Framework 基础:你应该熟悉序列化器、视图集或 API 视图,以及 DRF 如何处理请求和响应。
- 基本命令行操作:本教程中你将在终端中运行命令。
你需要安装的工具:
- Python 3.8 或更高版本
- pip(Python 的包管理器)
- 代码编辑器,如 Visual Studio Code
- Postman(或任何 API 测试工具)用于测试你的端点。你将使用它向 API 发送请求。
什么是 JWT,为什么选择它而不是会话认证?
在编写任何代码之前,理解 JWT 解决了什么问题,以及为什么 Django 内置的会话认证并不总是足够,是非常重要的。
会话认证的工作原理
Django 自带了一个基于会话的身份验证系统。其工作原理大致如下:
- 用户向服务器发送用户名和密码。
- 服务器验证凭据,并创建一个会话——这是一个存储在服务器数据库中的小记录,表示“此用户已登录”。
- 服务器将一个会话 ID作为 Cookie 返回。浏览器会自动存储此 Cookie。
- 在后续的每次请求中,浏览器都会将该 Cookie 发送回服务器。服务器在数据库中查找该会话 ID,并说:“啊,这是用户 A。放行。”
![Image 2: The infographics shows the steps taken in Django session authentication](https://cdn.hashnode.com/uploads/covers/69bdd408475ca179744595