This commit is contained in:
doudou201703
2026-08-02 14:07:04 +08:00
commit 046fac6dc1
339 changed files with 19435 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
import base64
import os
import django
from Crypto.Cipher import PKCS1_OAEP, PKCS1_v1_5
from sixGuoDjango.settings import base_dir_name
os.environ.setdefault( key="DJANGO_SETTINGS_MODULE", value=f"{base_dir_name}.settings" )
django.setup( )
from pathlib import Path
from Crypto.PublicKey import RSA
from django.conf import settings
def jwt_rsa_证书创建( ):
# 生成2048位密钥对
key = RSA.generate( bits=2048 )
#
# 导出私钥(PEM格式)
private_key = key.export_key( passphrase=settings.SECRET_KEY )
# print( "私钥:\n", private_key.decode( ) )
# 导出公钥(PEM格式)
public_key = key.publickey( ).export_key( )
Path( settings.BASE_DIR ).joinpath( "django_jwt_token/private.pem" ).write_bytes( data=private_key )
Path( settings.BASE_DIR ).joinpath( "django_jwt_token/public.pem" ).write_bytes( data=public_key )
print( "证书创建成功了" )
if __name__ == "__main__":
# 这里写你的主程序代码
pass
jwt_rsa_证书创建( )
+50
View File
@@ -0,0 +1,50 @@
import os
import django
from sixGuoDjango.settings import base_dir_name
os.environ.setdefault( key="DJANGO_SETTINGS_MODULE", value=f"{base_dir_name}.settings" )
django.setup( )
from datetime import datetime, timedelta, timezone
from pathlib import Path
from Crypto.PublicKey import RSA
from django.conf import settings
from jwt import JWT
from jwt.jwk import jwk_from_pem
from jwt.utils import get_int_from_datetime
# 创建 JWT 实例
instance = JWT( )
# 创建 payload
message = {
'iss': 'my-app',
'sub': 'user123',
'name': '张三',
'role': 'admin',
'iat': get_int_from_datetime( datetime.now( timezone.utc ) ),
'exp': get_int_from_datetime( datetime.now( timezone.utc ) + timedelta( hours=1 ) ),
}
# ✅ 正确:使用私钥进行签名
private_key_pem_私钥 = Path( "private.pem" ).read_bytes( )
私钥对象 = RSA.import_key( extern_key=private_key_pem_私钥, passphrase=settings.SECRET_KEY ).export_key( )
signing_key = jwk_from_pem( pem_content=私钥对象 )
token = instance.encode( message, signing_key, alg='RS256' ) # 注意算法名改为 RS256
print( f"生成的 JWT: {token}" )
# ✅ 正确:使用公钥进行验证
public_key_pem_公钥 = Path( "public.pem" ).read_bytes( )
verifying_key = jwk_from_pem( pem_content=public_key_pem_公钥 )
# 解码验证 JWT
received_message = instance.decode( message=token, key=verifying_key, do_time_check=True )
print( f"解码后的消息: {received_message}" )
+90
View File
@@ -0,0 +1,90 @@
from pathlib import Path
from zoneinfo import ZoneInfo
import pydash
from django.conf import settings
from jwt import JWT, jwk_from_pem
from jwt.exceptions import JWTDecodeError
from jwt.utils import get_time_from_int
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from rest_framework.response import Response
public_key_pem_公钥 = Path( settings.BASE_DIR ).joinpath( "django_jwt_token/public.pem" ).read_bytes( )
instance = JWT( )
from rest_framework.permissions import BasePermission
from rest_framework.exceptions import AuthenticationFailed
class Jwt权限认证( BasePermission ):
"""自定义JWT认证权限类"""
def has_permission( self, request, view ):
"""
必须实现这个方法,返回 True 表示有权限,False 表示无权限
:param request: 请求对象
:param view: 视图对象
:return: bool
"""
# 获取 token(从 Authorization header 或 cookie)
auth_header = request.headers.get( 'Authorization', '' )
token = request.data.get( "token", None )
Authorization = pydash.get( obj=request.headers, path="Authorization" )
print( "有作用了啦" )
print( "拿到token了吗?", Authorization )
# ✅ 正确:使用公钥进行验证
verifying_key = jwk_from_pem( pem_content=public_key_pem_公钥 )
# 解码验证 JWT
received_message = instance.decode( message=Authorization, key=verifying_key, do_time_check=True )
print( f"解码后的消息: {received_message}" )
def has_object_permission( self, request, view, obj ):
pass
class Jwt身份认证( BaseAuthentication ):
def authenticate( self, request ):
try:
Authorization = request.headers.get( "Authorization", "" )
# ✅ 正确:使用公钥进行验证
verifying_key = jwk_from_pem( pem_content=public_key_pem_公钥 )
# 解码验证 JWT
received_message = instance.decode( message=Authorization, key=verifying_key, do_time_check=True )
过期时间戳 = pydash.get( obj=received_message, path="exp" )
time_过期日间 = get_time_from_int( 过期时间戳 ).astimezone( tz=ZoneInfo( key="Asia/Shanghai" ) )
print( "过期的时间为:", time_过期日间, received_message )
return received_message, time_过期日间,
except exceptions.AuthenticationFailed:
msg = "==============="
raise "认证失败"
except JWTDecodeError as e:
print( '999999999999999999999', str( e ) )
# 如果你想保留原始异常链
raise AuthenticationFailed( f"Token无效: {str( e )}" )
# raise f"Token无效: {str( e )}"
def authenticate_header( self, request ):
pass
"""
返回 HTTP 401 响应时,告诉客户端应该使用哪种认证方式
"""
return 'Bearer'
+30
View File
@@ -0,0 +1,30 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,FDB397A184DB8297
1k9DgnqNjn8QWzEw5AydYPKAAH/a5FQgw5tqNeRxLW7gOqV4ZH1XfY1QsRbHFKXU
i/t0m9gWbI+4VTphdCZPjAp0kHjxCUfsMZqEB6cwGvQ775bLoC002SJACshFOf0R
Aj/QnXPNexZ7gexHGbUnSGa+HMzJRelOBR+MyUiwa5Jq7UAaPlrWnCUIaByUOsHG
ZUqeftabkeV8FagXCy6Izcg+E0eB3TFA/lWxqlKMSVx2bvomS9X/d9f4uxx2Ejv5
9Oc09IKsu2XoHsQibSXTUDhsYEupAP6U+Bp3Yki8LOMusm/ERwV+UQwsitSxD1Gc
NeQnvZhI3acJvJka3KsZaDLm1ErtruY7xPyLOzttiz2np77MSfb2GvXU4RXPCwq6
odmc2SRNmY1b8+2+XRq/lOZHzkbdPQrHm6vd+OfjV5V1+4QQ+721qSCYeLx5lAmz
NRJziMBrF5jW4BNCWiPECT8Z1nMhVl/MJAYhn/zssMuxjJ5umFQCQ7UcvCsBRCc8
2aC2d0Qj/XGhLd92lXv/LcyOgx9YLyw/DdlwORp3H17dW+mMpgJMsRp3BS3Y0nHp
XN4oygsiNpgfDjbttu21A3fWbbFfe63Ef2xcuo4aAC+WpausHRTrK/7xkSRwX2Rm
S5Mc3yCCJ2237zTQi56sHbiFa3fkhP5jx9tJ4/lzFcJ9evlpWL6kjXCKIkzpVr1p
3uPJbw5BvoOZThkEbWmRX1gm+TC1IMWD4sGRN+rpjb9I3nFhvV+2zQBHZRB+lVz/
OhsffGTLbpzIVDs0EsmcpGmV8fVXJ4Ke1Vdy+ebE+ZBVYeTEJI5KyMzakjG+Fl0J
U5YX4NEVxLiF8Sb/B0Mx9h5VqDZHtltHuF2By0ud8C3JjbzvmapxLIqW4UTK47mU
dPTASM/dvUhPHsfiCkNZ1fbwlNzA3j0YSPIF2pZlz5sVKXCFQ1aLUVdYBbJ5AsyP
YHMVFSIT9vFr56YDxZ9f2zPVGo1sCiu/N6sqJdAO93sTN4sRiDiDBay+2W+et4cP
XEjPoDs4Ohxo0MrS74Y0Kxhf81KmjUTIS7uk1AQcpDQoldbN4UgomuLp1okLFBQl
kqS9PC01hTjv2LeC8TnOfzivl/KQtnl3xhzK8ylaSd/5VWUkOcM/Z4jqTTDqaL27
A5FRv2mjm7Ziaw2YjOPKxlXcsieOkbfuWbl3pbot7pg1oG4iwlSJCUcMJJUP4Kmm
bsN4X6JQagouaHj6SVqNWc8EBDQKppebmKUlyzrBPRhlAAZB/9fPoc5w0bCtn8Ne
v67OTQRtRJceY/C9jyhp/C3MXiSQkJ7Dltzko7R8ghIrUS4fRSpj35siUlPRpz7f
+nRlT2zD3D0R5fBl/nEBAA4mWryN2auDO9/54VtvfujUgWJkkNYPdw62l/f72a7V
hq7WQSpWBvo1r71lTpLw2EkZz/joF1FKsdi+1k+K/hP76wvOpwnALGrjvfQEgEQg
AgCA4zVTDHXkZz5tBndAaA2N2tDPfQmDdCv0IxCbvGXD3f861ChsNU5F/MeyE2X7
SHBT1H5mfSU/y4mwf5q9pbBYX/UO0+pnDWlC2TuJiI1fZx25Mjt8Pw==
-----END RSA PRIVATE KEY-----
+9
View File
@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmG+9lzwnpsABxqO00Aqe
it3cOTV2354FmIztL1GOa34odktiiUOJIGY1JhVN3LXt4CaSpCkK6tfSQRXOrF2j
d0QYimN0zIQwJ7GJnzPQynoBJh2O9u6zOMtVkFqG9eafEqaR2lf5Ol1Pu3evUJx0
a6IiIr+hxKJqP6MO73eeriKYV+4V/+jzrn2WJjp3RnM9P1PQ4fCkIAZOLmb9lB/W
sNMaEJs8nab3KJeILv5kLm1wDMYuLzQ3kGtCrQPK6riw9s02hELSWj3Wy1U8ZM8b
QcIv6WGn1Zyhwpos9CDe+sH2D4EejA7wMZoBg4M39GRikK8VKE1nvN1wjQ7eIAGg
fwIDAQAB
-----END PUBLIC KEY-----
@@ -0,0 +1,64 @@
import threading
import time
from datetime import datetime, timedelta
from pathlib import Path
from zoneinfo import ZoneInfo
from Crypto.PublicKey import RSA
from django.conf import settings
from jwt import JWT, jwk_from_pem
from jwt.utils import get_int_from_datetime
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.routers import DefaultRouter
from rest_framework.viewsets import ViewSet
private_key_pem_私钥 = Path( settings.BASE_DIR ).joinpath( "django_jwt/private.pem" ).read_bytes( )
class JwtUserViewSets( ViewSet ):
lock = threading.Lock( )
instance = JWT( ) # 创建对象
@action( detail=False, methods=[ "post" ], url_path="login" )
def login( self, request: Request ):
""""""
# 创建 payload
message = {
'iss': 'my-app',
'sub': 'user123',
'name': '张三',
'role': 'admin',
'iat': get_int_from_datetime( datetime.now( tz=ZoneInfo( key="utc" ) ) ), # 生成jwt-token的时间
'exp': get_int_from_datetime( datetime.now( tz=ZoneInfo( key="utc" ) ) + timedelta( hours=1 ) ), # 多长时间过期
}
# ✅ 正确:使用私钥进行签名 (目前我使用的是私钥加密的) (生成钥钥的时候就是加密的私钥)
私钥对象 = RSA.import_key( extern_key=private_key_pem_私钥, passphrase=settings.SECRET_KEY ).export_key( format="PEM" )
signing_key = jwk_from_pem( pem_content=私钥对象 )
token = self.instance.encode( payload=message, key=signing_key, alg='RS256' ) # 注意算法名改为 RS256
print( f"生成的 JWT: {token}" )
return Response( data=token, status=status.HTTP_200_OK, headers={ "Authorization": token, "Access-Control-Allow-Origin": "*" } )
JwtUserViewSetsRouter = DefaultRouter( )
JwtUserViewSetsRouter.register( prefix="", viewset=JwtUserViewSets, basename="JwtUserViewSets" )