1、实现login路由白名单获取Token
2、对非白名单的路由进行鉴权
2.1 检查headers里是否包含鉴权信息
2.2 检查是否Token过期或非法Token
安装pyjwt包 pip install pyjwt 'passlib[bcrypt]'
实现JWT 生成和解码类
class AuthHandle():
security=HTTPBearer()
pwd_context=CryptContext(schemes=['bcrypt'],deprecated='auto')
secret=settings.JWT_SECRET_KEY
# 生成Token
async def encode_token(self,user_id:int)->str:
payload= {
'exp': datetime.now()+timedelta(days=0,minutes=120),
'sub': str(user_id)
}
return jwt.encode(payload,self.secret,algorithm='HS256')
# 验证Token
async def decode_token(self,token):
try:
payload=jwt.decode(token,self.secret,algorithms=['HS256'])
return payload['sub']
except jwt.ExpiredSignatureError:
raise AuthException(message='令牌已过期')
except jwt.InvalidTokenError:
raise AuthException(message='无效令牌