Skip to content

Commit 910ddc8

Browse files
authored
[Authlib] Improve Flask integrations (#16368)
1 parent ad33253 commit 910ddc8

13 files changed

Lines changed: 63 additions & 48 deletions

File tree

stubs/Authlib/@tests/stubtest_allowlist.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,5 @@ authlib.oidc.core.grants.implicit.OpenIDImplicitGrant.validate_consent_request
4545
authlib.integrations.django_client.*
4646
authlib.integrations.django_oauth1.*
4747
authlib.integrations.django_oauth2.*
48-
authlib.integrations.flask_client.*
49-
authlib.integrations.flask_oauth1.*
50-
authlib.integrations.flask_oauth2.*
5148
authlib.integrations.sqla_oauth2.*
5249
authlib.integrations.starlette_client.*

stubs/Authlib/METADATA.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
version = "1.8.0"
22
upstream-repository = "https://github.com/authlib/authlib"
33
dependencies = ["cryptography"]
4-
optional-dependencies = ["requests", "httpx2"]
4+
# Requires a version of flask with a `py.typed` file
5+
optional-dependencies = ["requests", "httpx2", "Flask>=2.0.0"]

stubs/Authlib/authlib/integrations/flask_client/__init__.pyi

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from _typeshed import Incomplete
22

3+
from flask import Flask
4+
35
from ..base_client import BaseOAuth, OAuthError as OAuthError
46
from .apps import FlaskOAuth1App as FlaskOAuth1App, FlaskOAuth2App as FlaskOAuth2App
57
from .integration import FlaskIntegration as FlaskIntegration, token_update as token_update
@@ -8,12 +10,12 @@ class OAuth(BaseOAuth):
810
oauth1_client_cls = FlaskOAuth1App
911
oauth2_client_cls = FlaskOAuth2App
1012
framework_integration_cls = FlaskIntegration
11-
app: Incomplete
12-
def __init__(self, app=None, cache=None, fetch_token=None, update_token=None): ...
13+
app: Flask | None
14+
def __init__(self, app: Flask | None = None, cache=None, fetch_token=None, update_token=None) -> None: ...
1315
cache: Incomplete
1416
fetch_token: Incomplete
1517
update_token: Incomplete
16-
def init_app(self, app, cache=None, fetch_token=None, update_token=None): ...
18+
def init_app(self, app: Flask, cache=None, fetch_token=None, update_token=None) -> None: ...
1719
def create_client(self, name): ...
1820
def register(self, name, overwrite=False, **kwargs): ...
1921

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
from _typeshed import Incomplete
2-
from typing import TypeAlias
2+
3+
from werkzeug.wrappers import Response
34

45
from ..base_client import BaseApp, OAuth1Mixin, OAuth2Mixin, OpenIDMixin
56
from ..requests_client import OAuth1Session, OAuth2Session
67

7-
_Response: TypeAlias = Incomplete # actual type is werkzeug.wrappers.Response
8-
98
class FlaskAppMixin:
109
@property
1110
def token(self): ...
1211
@token.setter
1312
def token(self, token): ...
1413

1514
def save_authorize_data(self, **kwargs) -> None: ...
16-
def authorize_redirect(self, redirect_uri=None, **kwargs): ...
15+
def authorize_redirect(self, redirect_uri=None, **kwargs) -> Response: ...
1716

1817
class FlaskOAuth1App(FlaskAppMixin, OAuth1Mixin, BaseApp):
1918
client_cls = OAuth1Session
20-
def authorize_access_token(self, **kwargs): ...
19+
def authorize_access_token(self, **kwargs) -> dict[Incomplete, Incomplete]: ...
2120

2221
class FlaskOAuth2App(FlaskAppMixin, OAuth2Mixin, OpenIDMixin, BaseApp):
2322
client_cls = OAuth2Session
2423
def logout_redirect(
2524
self, post_logout_redirect_uri=None, id_token_hint=None, *, state=None, client_id=None, logout_hint=None, ui_locales=None
26-
) -> _Response: ...
25+
) -> Response: ...
2726
def validate_logout_response(self): ...
28-
def authorize_access_token(self, **kwargs): ...
27+
def authorize_access_token(self, **kwargs) -> dict[Incomplete, Incomplete]: ...

stubs/Authlib/authlib/integrations/flask_client/integration.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from _typeshed import Incomplete
22

3+
from blinker import NamedSignal
4+
35
from ..base_client import FrameworkIntegration
46

5-
token_update: Incomplete
7+
token_update: NamedSignal
68

79
class FlaskIntegration(FrameworkIntegration):
810
def update_token(self, token, refresh_token=None, access_token=None) -> None: ...

stubs/Authlib/authlib/integrations/flask_oauth1/authorization_server.pyi

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ from _typeshed import Incomplete
33
from collections.abc import Callable
44

55
from authlib.oauth1 import AuthorizationServer as _AuthorizationServer, OAuth1Request
6+
from flask import Flask, Response
67

78
log: logging.Logger
89

910
class AuthorizationServer(_AuthorizationServer):
10-
app: Incomplete
11+
app: Flask | None
1112
query_client: Incomplete
1213
token_generator: Incomplete
13-
def __init__(self, app=None, query_client=None, token_generator=None): ...
14+
def __init__(self, app: Flask | None = None, query_client=None, token_generator=None) -> None: ...
1415
SUPPORTED_SIGNATURE_METHODS: Incomplete
15-
def init_app(self, app, query_client=None, token_generator=None): ...
16-
def register_hook(self, name, func) -> None: ...
17-
def create_token_generator(self, app) -> Callable[[], dict[str, str]]: ...
16+
def init_app(self, app: Flask, query_client=None, token_generator=None) -> None: ...
17+
def register_hook(self, name: str, func) -> None: ...
18+
def create_token_generator(self, app: Flask) -> Callable[[], dict[str, str]]: ...
1819
def get_client_by_id(self, client_id): ...
1920
def exists_nonce(self, nonce, request): ...
2021
def create_temporary_credential(self, request): ...
@@ -26,4 +27,4 @@ class AuthorizationServer(_AuthorizationServer):
2627
def create_authorization_response(self, request=None, grant_user=None): ...
2728
def create_token_response(self, request=None): ...
2829
def create_oauth1_request(self, request) -> OAuth1Request: ...
29-
def handle_response(self, status_code, payload, headers): ...
30+
def handle_response(self, status_code, payload, headers) -> Response: ...
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
from _typeshed import Incomplete
22
from collections.abc import Callable
33

4-
def register_temporary_credential_hooks(authorization_server, cache, key_prefix: str = "temporary_credential:") -> None: ...
4+
from authlib.oauth1.rfc5849.authorization_server import AuthorizationServer
5+
6+
def register_temporary_credential_hooks(
7+
authorization_server: AuthorizationServer, cache, key_prefix: str = "temporary_credential:"
8+
) -> None: ...
59
def create_exists_nonce_func(
6-
cache, key_prefix="nonce:", expires=86400
10+
cache, key_prefix: str = "nonce:", expires=86400
711
) -> Callable[[Incomplete, Incomplete, Incomplete, Incomplete], Incomplete]: ...
8-
def register_nonce_hooks(authorization_server, cache, key_prefix: str = "nonce:", expires=86400) -> None: ...
12+
def register_nonce_hooks(authorization_server: AuthorizationServer, cache, key_prefix: str = "nonce:", expires=86400) -> None: ...
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
from _typeshed import Incomplete
22

33
from authlib.oauth1 import ResourceProtector as _ResourceProtector
4+
from flask import Flask
5+
from werkzeug.local import LocalProxy
46

57
class ResourceProtector(_ResourceProtector):
6-
app: Incomplete
8+
app: Flask | None
79
query_client: Incomplete
810
query_token: Incomplete
9-
def __init__(self, app=None, query_client=None, query_token=None, exists_nonce=None) -> None: ...
11+
def __init__(self, app: Flask | None = None, query_client=None, query_token=None, exists_nonce=None) -> None: ...
1012
SUPPORTED_SIGNATURE_METHODS: Incomplete
11-
def init_app(self, app, query_client=None, query_token=None, exists_nonce=None): ...
13+
def init_app(self, app: Flask, query_client=None, query_token=None, exists_nonce=None) -> None: ...
1214
def get_client_by_id(self, client_id): ...
1315
def get_token_credential(self, request): ...
1416
def exists_nonce(self, nonce, request): ...
1517
def acquire_credential(self): ...
1618
def __call__(self, scope=None): ...
1719

18-
current_credential: Incomplete
20+
current_credential: LocalProxy[Incomplete]

stubs/Authlib/authlib/integrations/flask_oauth2/authorization_server.pyi

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@ from _typeshed import Incomplete
22

33
from authlib.oauth2 import AuthorizationServer as _AuthorizationServer
44
from authlib.oauth2.rfc6750 import BearerTokenGenerator
5+
from flask import Flask, Response
56

67
from .requests import FlaskJsonRequest, FlaskOAuth2Request
78

89
class AuthorizationServer(_AuthorizationServer):
9-
def __init__(self, app=None, query_client=None, save_token=None) -> None: ...
10-
def init_app(self, app, query_client=None, save_token=None) -> None: ...
10+
def __init__(self, app: Flask | None = None, query_client=None, save_token=None) -> None: ...
11+
def init_app(self, app: Flask, query_client=None, save_token=None) -> None: ...
1112
scopes_supported: Incomplete
1213
def load_config(self, config) -> None: ...
1314
def query_client(self, client_id): ...
1415
def save_token(self, token, request): ...
1516
def get_error_uri(self, request, error): ...
1617
def create_oauth2_request(self, request) -> FlaskOAuth2Request: ...
1718
def create_json_request(self, request) -> FlaskJsonRequest: ...
18-
def handle_response(self, status_code, payload, headers): ...
19+
def handle_response(self, status_code, payload, headers) -> Response: ...
1920
def send_signal(self, name, *args, **kwargs) -> None: ...
2021
def create_bearer_token_generator(self, config) -> BearerTokenGenerator: ...
2122

stubs/Authlib/authlib/integrations/flask_oauth2/errors.pyi

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from _typeshed import Incomplete
22
from typing_extensions import Never
33

4-
# Inherits from werkzeug.exceptions.HTTPException
5-
class _HTTPException:
4+
from werkzeug.exceptions import HTTPException
5+
from werkzeug.sansio.response import Response as SansIOResponse
6+
7+
class _HTTPException(HTTPException):
68
code: Incomplete
79
body: Incomplete
810
headers: Incomplete
9-
def __init__(self, code, body, headers, response=None) -> None: ...
11+
def __init__(self, code, body, headers, response: SansIOResponse | None = None) -> None: ...
1012
# Params depends on `werkzeug` package version
1113
def get_body(self, environ=None, scope=None): ...
1214
def get_headers(self, environ=None, scope=None): ...

0 commit comments

Comments
 (0)