Sanic 登录实现Token和鉴权

蓝图

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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒云客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值