python / python/typeshed

AsyncOAuth2Client missing async context manager protocol (__aenter__, __aexit__)

Abierto
#15,246 1 comentario 0 reacciones 0 asignados Ver en GitHub

@robertuss12 ya está trabajando en esto.

Desde el 29/12/2025.

  • #15190 de @robertuss12 — abierto
Lenguaje dominante
Python
Estrellas
5.1k
Forks
2.1k
Merge medio
1 d 19 h
PR fusionados (30 d)
82

Descripción

Problem

The AsyncOAuth2Client class in stubs/Authlib/authlib/integrations/httpx_client/oauth2_client.pyi is missing type annotations for the async context manager protocol (__aenter__ and __aexit__), causing type checkers to incorrectly flag valid async with usage as errors.

Expected Behavior

AsyncOAuth2Client should be usable as an async context manager since it inherits from httpx.AsyncClient at runtime:

from authlib.integrations.httpx_client import AsyncOAuth2Client

async with AsyncOAuth2Client(client_id="...", client_secret="...") as client:
    response = await client.get("https://api.example.com/data")

Actual Behavior

Pyright reports errors:

error: Object of type "AsyncOAuth2Client" cannot be used with "async with" because it does not correctly implement __aenter__
  Attribute "__aenter__" is unknown (reportGeneralTypeIssues)
error: Object of type "AsyncOAuth2Client" cannot be used with "with" because it does not correctly implement __aexit__
  Attribute "__aexit__" is unknown (reportGeneralTypeIssues)

Root Cause

The stub file at line 26-27 shows:

# Inherits from httpx.AsyncClient
class AsyncOAuth2Client(_OAuth2Client):

The comment is correct but the type stub is incomplete. The class should expose the async context manager protocol from httpx.AsyncClient, but it's not properly modeled in the stubs.

Runtime Verification

At runtime, AsyncOAuth2Client does have these methods:

from authlib.integrations.httpx_client import AsyncOAuth2Client
print(hasattr(AsyncOAuth2Client, '__aenter__'))  # True
print(hasattr(AsyncOAuth2Client, '__aexit__'))   # True

Proposed Fix

Update stubs/Authlib/authlib/integrations/httpx_client/oauth2_client.pyi to explicitly declare the async context manager protocol:

from typing_extensions import Self

class AsyncOAuth2Client(_OAuth2Client):
    SESSION_REQUEST_PARAMS: list[str]
    client_auth_class = OAuth2ClientAuth
    token_auth_class = OAuth2Auth
    oauth_error_class = OAuthError
    def __init__(
        self,
        client_id=None,
        client_secret=None,
        token_endpoint_auth_method=None,
        revocation_endpoint_auth_method=None,
        scope=None,
        redirect_uri=None,
        token=None,
        token_placement="header",
        update_token=None,
        leeway=60,
        **kwargs,
    ) -> None: ...
    async def __aenter__(self) -> Self: ...
    async def __aexit__(self, exc_type, exc_val, exc_tb) -> None: ...
    async def request(self, method, url, withhold_token: bool = False, auth=..., **kwargs): ...
    async def stream(self, method, url, withhold_token: bool = False, auth=..., **kwargs) -> Generator[Incomplete]: ...
    async def ensure_active_token(self, token): ...

Similarly, OAuth2Client (the sync version) may need __enter__ and __exit__ methods.

Affected Versions

  • types-Authlib>=1.4.0 (when httpx_client stubs were added in PR #15147)
  • Works correctly in types-Authlib==1.3.0.20241229 (no httpx_client stubs existed)

Related Files

  • stubs/Authlib/authlib/integrations/httpx_client/oauth2_client.pyi (line 26-48)

Labels to add: stubs: incomplete

Issue URL: https://github.com/python/typeshed/issues/new

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con stubs/Authlib/authlib/integrations/httpx_client/oauth2_client.pyi, especialmente con la declaración de AsyncOAuth2Client alrededor de las líneas 26–48, y revisa el pull request #15190 enlazado. Comprueba el ejemplo de async with usando Pyright; se considera terminado cuando el stub expone el comportamiento del gestor de contexto en tiempo de ejecución sin esos errores de protocolo, y la posible cuestión de sync OAuth2Client queda abordada si está dentro del alcance.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
tooling
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.