您的位置:

解决HTTPException(status_code=HTTP_403_FORBIDDEN,detail="Invalid authentication credentials",)在fastapi出现报错

  发布时间:2023-01-26 02:30:01
报错的原因FastAPI 中的出现可能是因为试图使用无效的身份验证凭证进行身份验证。这会导致 login() 函数抛出 HTTPException 异常,并返回状态码 和错误信息如果验证成功,则会生成一个 JWT 令牌并返回给用户。需要注意的是,在这个示例中,身份验证函数和 JWT 相关函数都没有给出具体实现,需要根据具体需求来实现。使用FastAPI和JWT 身份验证还有很多细节需要注意,比如JWT令牌的加密,令牌过期时间设置,令牌更新策略等。建议使用者在实际应用之前进行相应的学习和了解。

报错的原因

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令牌的加密,令牌过期时间设置,令牌更新策略等。建议使用者在实际应用之前进行相应的学习和了解。