six_001
This commit is contained in:
@@ -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_证书创建( )
|
||||
@@ -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}" )
|
||||
@@ -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'
|
||||
@@ -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-----
|
||||
@@ -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" )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user