Files
sixGuoDjango/django_jwt_token/用户登陆身份接口.py
T
2026-08-02 14:07:04 +08:00

65 lines
2.0 KiB
Python

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" )