Skip to content

Commit 02328d0

Browse files
authored
authlib: Allow setting token request timeout (#103)
1 parent 5c6375b commit 02328d0

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Version 0.7
66

77
- Support multiple id fields in SAML identity provider
88
- Include ``client_id`` in authlib logout URL since some OIDC providers mayrequire this
9+
- Allow setting timeout for authlib token requests (default: 10 seconds)
910

1011
Version 0.6
1112
-----------

flask_multipass/providers/authlib.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
from authlib.common.errors import AuthlibBaseError
1111
from authlib.integrations.flask_client import FlaskIntegration, OAuth
1212
from flask import current_app, redirect, request, url_for
13-
from requests.exceptions import HTTPError, RequestException
13+
from requests.exceptions import HTTPError, RequestException, Timeout
1414

1515
from flask_multipass.auth import AuthProvider
1616
from flask_multipass.data import AuthInfo, IdentityInfo
17-
from flask_multipass.exceptions import AuthenticationFailed, IdentityRetrievalFailed
17+
from flask_multipass.exceptions import AuthenticationFailed, IdentityRetrievalFailed, MultipassException
1818
from flask_multipass.identity import IdentityProvider
1919
from flask_multipass.util import login_view
2020

@@ -70,13 +70,17 @@ class AuthlibAuthProvider(AuthProvider):
7070
of ``register()`` in the
7171
`authlib docs <https://docs.authlib.org/en/latest/client/frameworks.html>`_
7272
for details.
73+
- ``request_timeout``: the timeout in seconds for fetching the oauth token and
74+
requesting data from the userinfo endpoint (10 by default,
75+
set to None to disable)
7376
"""
7477

7578
def __init__(self, *args, **kwargs):
7679
super().__init__(*args, **kwargs)
7780
callback_uri = self.settings.get('callback_uri', f'/multipass/authlib/{self.name}')
7881
self.authlib_client = _authlib_oauth.register(self.name, **self.authlib_settings)
7982
self.include_token = self.settings.get('include_token', False)
83+
self.request_timeout = self.settings.get('request_timeout')
8084
self.use_id_token = self.settings.get('use_id_token')
8185
if self.use_id_token is None:
8286
# default to using the id token when using the openid scope (oidc)
@@ -121,7 +125,10 @@ def _authorize_callback(self):
121125
raise AuthenticationFailed(error, provider=self)
122126
try:
123127
try:
124-
token_data = self.authlib_client.authorize_access_token()
128+
token_data = self.authlib_client.authorize_access_token(timeout=self.request_timeout)
129+
except Timeout as exc:
130+
logging.getLogger('multipass.authlib').error('Getting token timed out')
131+
raise MultipassException('Token request timed out, please try again later') from exc
125132
except HTTPError as exc:
126133
try:
127134
data = exc.response.json()

0 commit comments

Comments
 (0)