需要授权的是get_user_project这个函数
@router.get("/userProejct", summary="用户项目")
def get_user_project(current_user: str = Depends(get_current_user),name: str = "", username: str = "",page: int = Query(1),limit:int = Query(10)):
使用fastapi原生自带的AUTH_SCHEMA 作为权限控制
SECRET_KEY = "test22"
# 设置过期时间 现在时间 + 有效时间 示例5分钟
expire = datetime.utcnow() + timedelta(minutes=5) # exp 是固定写法必须得传 sub和uid是自己存的值
to_encode = {"exp": expire, "password": "123", "username": "tt"} # 生成token
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm="HS256")
AUTH_SCHEMA = OAuth2PasswordBearer(tokenUrl="/login")
def get_current_user(token: str = Depends(AUTH_SCHEMA))->str:
"""认证当前用户"""
try:
decode_token=jwt.decode(token, SECRET_KEY, algorithms="HS256")
username: str = decode_token.get("username")
if username is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效令牌")
except JWTError:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效认证凭证")
return username
不过fastapi 的权限控制,他要在请求头header上"Authorization":“Bearer 你的token”.OAuth2PasswordBearer会自动解析请求头这个参数的内容,解析不到就报权限失败
这个用法是写死固定的。如果你的项目前端统一使用token作为header传参就比较麻烦了
所以我们就放弃原生的fastapi权限设置,用自己的权限控制
将get_current_user参数换成request: Request,这样就能控制我们只传入token就好了。也是比较简单的
#AUTH_SCHEMA = OAuth2PasswordBearer(tokenUrl="/login")
# decode_token=jwt.decode(encoded_jwt, SECRET_KEY, algorithms="HS256")
def get_current_user(request: Request)->str:
"""认证当前用户"""
try:
decode_token=jwt.decode(request.headers.get('token'), SECRET_KEY, algorithms="HS256")
username: str = decode_token.get("username")
if username is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="用户不存在")
except JWTError:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效token")
return username