如何将 FastAPI OAuth 函数移动到类中,而不会将"self"解释为 API 参数?



我正在将OAuth添加到一个简单的web应用程序中,并完成了出色的FastAPI安全教程(https://fastapi.tiangolo.com/tutorial/security/)。然而,在他们的教程中,所有内容都在一个脚本中。我想将我所有的身份验证方法移到AuthService类中。这个类执行一些操作,比如连接到数据库中的用户集合,执行密码哈希,还创建OAuth方案(使用fastapi.security中的OAuth2PasswordBearer(。

我能够成功地将所有内容转移到这个类,除了几个函数。在我的routes/目录中,我有这两个函数来处理获取用户信息。你可以看到它们都引用了我之前提到的auth_service对象:

async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=[os.getenv('ALGORITHM')])
email: str = payload.get("sub")
if email is None:
raise credentials_exception
token_data = TokenData(email=email)
except JWTError:
raise credentials_exception
user = auth_service.get_user(email=token_data.email)
if user is None:
raise credentials_exception
return user
async def get_current_active_user(current_user: User = Depends(get_current_user)):
if current_user.disabled:
raise HTTPException(status_code=400, detail="Inactive user")
return current_user

当我试图将这些方法移动到AuthService类时,我突然不知道该如何处理我的端点。例如,以前是:

@router.get("/users/me", response_model=User)
async def read_users_me(current_user: User = Depends(get_current_active_user)):
return current_user

在API文档中,没有显示任何参数(可能是因为没有活动用户?(。但现在,当我用auth_service.get_current_active_user替换get_current_active_user时,API显示为需要此端点的电子邮件/密码等。所以我有点困惑。

所以,基本上——有没有办法把我所有的身份验证方法都放到一个AuthService类中?

也许可以在AuthService类中将这些函数转换为"classmethods"。在这种情况下,您不需要实例化AuthService类。

所以类似于:

class AuthService:
@classmethod
async def get_current_user():
....

最新更新