Estoy tratando de configurar la autenticación FastAPI (0.71.0) con clientid-clientsecret.
Configuré OAuth2AuthorizationCodeBearer y aparentemente desde el punto final de swagger ( /docs ) se ve bien, solicita la identificación del cliente y el secreto del cliente para la autenticación.
auth = OAuth2PasswordBearer( authorizationUrl=AUTH_URL, tokenUrl=TOKEN_URL, ) agent = FastAPI( description=_DESCRIPTION, version=VERSION, dependencies=[Depends(auth)], middleware=middlewares, root_path=os.getenv('BASEPATH', '/'), swagger_ui_init_oauth={ 'usePkceWithAuthorizationCodeGrant': True, 'scopes': 'openid profile email' } )Sin embargo, al llamar directamente a la API, puedo acceder con cualquier portador, como:
import requests url = 'http://localhost:8080/test' headers = {'Authorization': 'Bearer BADTOKEN', 'Content-Type': 'application/json', 'Accept': 'application/json'} response = requests.get(url=url, params={}, headers=headers) y response.ok = True , por lo que es posible que me falte algo en la configuración de FastAPI, pero no puedo ver dónde.
¿Es este el flujo de autenticación correcto?
PD: lo que quiero lograr es una comunicación de servicio a servicio, por lo que un usuario normal no accede a la API
Después de echar un vistazo a la implementación de OAuth2AuthorizationCodeBearer , terminé agregando un método para verificar la validez del token del portador:
public_key = requests.get(ISSUER_URL).json().get('public_key') key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----' oauth = OAuth2AuthorizationCodeBearer( authorizationUrl=AUTH_URL, tokenUrl=TOKEN_URL, ) async def auth(token: str | None = Depends(oauth)): try: jwt.decode( token, key=key, options={ "verify_signature": True, "verify_aud": False, "verify_iss": ISSUER_URL } ) except JOSEError as e: # catches any exception raise HTTPException( status_code=401, detail=str(e))