蓝图
app.blueprint(Users,url_prefix='/users')
@Users.post('/login') # username (6-20) password (8-)
@validate(json=Account)
async def login(req:Request,body:Account)->HTTPResponse:
info=req.json
# logger.info(app.ctx.secert)
token=JwtUtils.encryption(1,TOKEN_SECERT)
return json(ResultUtils.success(token))
uv add pyjwt 'passlib[bcrypt]'
import jwt
from datetime import timedelta,datetime,timezone
class JwtUtils():
@staticmethod
def encryption(userid:int,key:str)->str:
payload={
'exp': datetime.now(timezone.utc)+timedelta(days=0,minutes=120),
'iat': datetime.now(timezone.utc),
'sub': userid
}
return str(jwt.encode(payload,key,algorithm='HS256'))
def decryption(token:str)->int:
try:
payload=jwt.decode(token,TOKEN_SECERT,algorithms=['HS256'])
return payload['sub']
except jwt.ExpiredSignatureError:
raise SanicException(message='令牌已过期',status_code=401)
except jwt.InvalidTokenError:
raise SanicException(message='无效令牌',status_code=401)

中间件实现鉴权
async def auth_middleware(req:Request):
if req.path not in ['/users/login']:
token=req.token
req.ctx.user=JwtUtils.decryption(token)
标准化输出
async def logging(req:Request,res:HTTPResponse):
data=json2.loads(res.body.decode('utf-8'))
if 'status' in data:
match data['status']:
case 400:
return json(ResultUtils.bad_request('10400',data['message']),status=400)
case 401:
return json(ResultUtils.unauthorized('10401',data['message']),status=401)
5万+

被折叠的 条评论
为什么被折叠?



