解决HTTPException(status_code=HTTP_403_FORBIDDEN,detail="Invalid authentication credentials",)在fastapi出现报错
报错的原因
FastAPI 中 HTTPException(status_code=HTTP_403_FORBIDDEN, detail="Invalid authentication credentials") 的出现可能是因为试图使用无效的身份验证凭证(例如用户名或密码)进行身份验证。这个错误通常在身份验证过程中由于验证不通过而引发异常来抛出。
如何解决
可以在进行身份验证之前,先对用户提交的凭证进行校验。如果凭证无效,可以提前给用户反馈一个错误信息,提示用户名或密码不正确,请重试。
在进行身份验证时,可以使用框架内置的身份验证机制,或者使用第三方库来进行身份验证,如 JWT 。
还需要考虑对于身份验证失败的用户进行限制,比如多次验证失败后将其锁定或者需要进行验证码验证。
下面是一个使用FastAPI和JWT进行身份验证的示例
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from jwt import PyJWTError
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: str
full_name: str
disabled: bool
def authenticate_user(username: str, password: str):
user = get_user(username)
if not user:
return False
if not verify_password(password, user.hashed_password):
return False
return user
def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = decode_token(token)
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=400, detail="Invalid token")
except PyJWTError:
raise HTTPException(status_code=400, detail="Invalid token")
user = get_user(username=username)
if user is None:
raise HTTPException(status_code=404, detail="User not found")
return user
@app.post("/token")
def login(form_data: OAuth2PasswordBearer):
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=403, detail="Invalid credentials")
access_token =
create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me")
def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
这段代码中,当用户提交了无效的用户名或密码时,会在 authenticate_user() 中返回 False 。这会导致 login() 函数抛出 HTTPException 异常,并返回状态码 403 和错误信息 "Invalid credentials"。如果验证成功,则会生成一个 JWT 令牌并返回给用户。
需要注意的是,上面的示例只是一个简单的示例,在实际的应用中,还需要对用户密码进行加密和安全措施,还要考虑更多的安全问题,比如跨站请求伪造,令牌泄露等。
使用例子
上面已经给出了一个使用FastAPI和JWT进行身份验证的示例。
需要注意的是,在这个示例中,身份验证函数 authenticate_user() 和 JWT 相关函数 decode_token()、create_access_token() 都没有给出具体实现,需要根据具体需求来实现。
使用FastAPI和JWT 身份验证还有很多细节需要注意,比如JWT令牌的加密,令牌过期时间设置,令牌更新策略等。建议使用者在实际应用之前进行相应的学习和了解。