Django REST Framework JWT 认证实战指南
本文详解如何在 Django REST Framework 中集成 JWT 认证。涵盖 JWT 结构解析、rest_framework_jwt 库安装、全局与局部认证配置、自定义验证类编写及前端表单提交示例,帮助开发者快速实现安全的 API 身份验证机制。
JWT 简介与核心结构
简介
JWT(JSON Web Token)是一项开放标准(RFC 7519),旨在为通信双方提供一种简洁且自包含的安全信息传递方式,数据以 JSON 对象形式传输。由于经过数字签名,该信息具备可验证性和可信度。JWT 支持使用 HMAC 算法配合秘密密钥进行签名,或使用 RSA、ECDSA 算法配合公钥/私钥对进行签名。
JWT 主要由以下三个部分组成:
Header(头部)
Header 是一个 JSON 对象,经 Base64 编码后生成字符串。Base64 编码并非加密,解码后可还原原始 JSON,因此 JWT 中不应存放敏感信息。Header 通常声明编码对象为 JWT 类型,并指定用于生成 Signature 的哈希算法(如 SHA-256)。
Payload(负载)
Payload 由 Claim 集合经 Base64 编码生成的字符串。Claim 是一个 JSON 对象,包含 JWT 的标准属性(如签发者、接收者、过期时间等),这些标准属性均为可选。此外,Claim 还可包含自定义属性,例如用于标识用户身份的数据库 ID。出于安全考虑,用户名和密码等敏感信息不应存入 Claim。
Signature(签名)
Signature 由 Header 和 Payload 组合生成。具体过程为:先将 Header 和 Payload 分别进行 Base64 编码得到字符串,再以“Header.Payload”格式拼接。随后,使用预先定义的加密算法及服务器端存储的密钥对该字符串进行加密,生成最终的签名字符串。
签名的主要目的是防止内容被篡改。若有人对解码后的 Header 和 Payload 进行修改并重新编码,再结合原有签名生成新的 JWT,服务器端在验证时会发现新生成的签名与 JWT 附带的签名不一致。由于不知道服务器加密所用的密钥,攻击者无法生成有效的签名。
rest_framework_jwt 库配置与使用
rest_framework_jwt 库介绍
rest_framework_jwt 是一个封装了符合 RESTful 规范的 JWT 接口库,简化了 Django REST Framework 中的 JWT 实现。
官方文档地址:http://getblimp.github.io/django-rest-framework-jwt/
安装方法:pip install djangorestframework-jwt
二、配合 DRF 认证组件的使用方法
配置文件
全局认证配置
#添加rest-framework
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
"rest_framework",
]
REST_FRAMEWORK = {
# 配置默认的认证方式 base:账号密码验证
#session:session_id认证
'DEFAULT_AUTHENTICATION_CLASSES': (
# drf的这一阶段主要是做验证,middleware的auth主要是设置session和user到request对象
# 默认的验证是按照验证列表从上到下的验证
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
"rest_framework_jwt.authentication.JSONWebTokenAuthentication",
)}
import datetime
# 超时时间
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# token前缀
'JWT_AUTH_HEADER_PREFIX': 'JWT',
}
# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app01.User"
模型表
自定义用户模型
#使用django自带的auth组件模型表
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
phone=models.CharField(max_length=11,null=True)
URL 路由层
路由与视图配置
from django.conf.urls import url
from django.contrib import admin
from rest_framework_jwt.views import obtain_jwt_token
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^home/', views.Home.as_view()),
# 登入验证,使用JWT的模块,只要用户密码正确会自动生成一个token返回
url(r'^login/', obtain_jwt_token),
# 访问需要认证的接口
url(r'^index/', views.Index.as_view()),
]
View 视图层
from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.
from rest_framework.views import APIView
from app01.jwtMiddleware import TokenAuth
class Index(APIView): #局部认证的配置
authentication_classes = [TokenAuth,]
def get(self,request):
return JsonResponse({"index":"ok"})
class Home(APIView):
def get(self,request):
return render(request,"login.html")
REST Framework 认证类
局部认证类实现
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer
class TokenAuth():
def authenticate(self, request):
token={"token":None}
# print(request.META.get("HTTP_TOKEN"))
token["token"] = request.META.get('HTTP_TOKEN')
valid_data = VerifyJSONWebTokenSerializer().validate(token)
print(valid_data)
user = valid_data['user']
print(user)
if user:
return
else:
raise AuthenticationFailed('认证失败')
模板
前端登录模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
Postman 测试


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









