plamut: Well go figure, running the `blacken` session can cause syntax errors, because a trailing comma is not allowed after **kwargs in Python <= 3.5. :smile: 
diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py
index ce78e63..1c709d4 100644
--- a/google/auth/transport/requests.py
+++ b/google/auth/transport/requests.py
@@ -42,6 +42,8 @@ from google.auth import transport
 
 _LOGGER = logging.getLogger(__name__)
 
+_DEFAULT_TIMEOUT = 120  # in seconds
+
 
 class _Response(transport.Response):
     """Requests transport response adapter.
@@ -141,7 +143,13 @@ class Request(transport.Request):
         self.session = session
 
     def __call__(
-        self, url, method="GET", body=None, headers=None, timeout=120, **kwargs
+        self,
+        url,
+        method="GET",
+        body=None,
+        headers=None,
+        timeout=_DEFAULT_TIMEOUT,
+        **kwargs
     ):
         """Make an HTTP request using requests.
 
@@ -246,7 +254,7 @@ class AuthorizedSession(requests.Session):
         data=None,
         headers=None,
         max_allowed_time=None,
-        timeout=None,
+        timeout=_DEFAULT_TIMEOUT,
         **kwargs
     ):
         """Implementation of Requests' request.

Set the default request timeout to something other than `None`
The [AuthorizedSession.requests()](https://github.com/googleapis/google-auth-library-python/blob/1b9de8dfbe4523f3170e47985ab523cb7865de48/google/auth/transport/requests.py#L242-L251) method does not specify a default timeout.

Since production code would almost always want to have some sort of a timeout, let's add one. The libraries that rely on `google-auth`, but do (yet) not specify a timeout themselves, would benefit from that.

Example: [storage issue](https://github.com/googleapis/google-cloud-python/issues/10182)

diff --git a/tests/transport/test_requests.py b/tests/transport/test_requests.py
index 8f73d4b..f0321c8 100644
--- a/tests/transport/test_requests.py
+++ b/tests/transport/test_requests.py
@@ -177,6 +177,21 @@ class TestAuthorizedHttp(object):
 
         assert authed_session._auth_request == auth_request
 
+    def test_request_default_timeout(self):
+        credentials = mock.Mock(wraps=CredentialsStub())
+        response = make_response()
+        adapter = AdapterStub([response])
+
+        authed_session = google.auth.transport.requests.AuthorizedSession(credentials)
+        authed_session.mount(self.TEST_URL, adapter)
+
+        patcher = mock.patch("google.auth.transport.requests.requests.Session.request")
+        with patcher as patched_request:
+            authed_session.request("GET", self.TEST_URL)
+
+        expected_timeout = google.auth.transport.requests._DEFAULT_TIMEOUT
+        assert patched_request.call_args.kwargs.get("timeout") == expected_timeout
+
     def test_request_no_refresh(self):
         credentials = mock.Mock(wraps=CredentialsStub())
         response = make_response()

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-localserver mock freezegun flask oauth2client requests urllib3 cryptography grpcio
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
blinker==1.9.0
cachetools==4.2.4
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
coverage==7.8.0
cryptography==44.0.2
exceptiongroup==1.2.2
Flask==3.1.0
freezegun==1.5.1
-e git+https://github.com/googleapis/google-auth-library-python.git@1b9de8dfbe4523f3170e47985ab523cb7865de48#egg=google_auth
grpcio==1.71.0
httplib2==0.22.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.2
mock==5.2.0
oauth2client==4.1.3
packaging==24.2
pluggy==1.5.0
pyasn1==0.6.1
pyasn1_modules==0.4.2
pycparser==2.22
pyparsing==3.2.3
pytest==8.3.5
pytest-cov==6.0.0
pytest-localserver==0.9.0.post0
python-dateutil==2.9.0.post0
requests==2.32.3
rsa==4.0
six==1.17.0
tomli==2.2.1
urllib3==2.3.0
Werkzeug==3.1.3
zipp==3.21.0

name: google-auth-library-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - blinker==1.9.0
      - cachetools==4.2.4
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.8.0
      - cryptography==44.0.2
      - exceptiongroup==1.2.2
      - flask==3.1.0
      - freezegun==1.5.1
      - grpcio==1.71.0
      - httplib2==0.22.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - mock==5.2.0
      - oauth2client==4.1.3
      - packaging==24.2
      - pluggy==1.5.0
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pycparser==2.22
      - pyparsing==3.2.3
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - pytest-localserver==0.9.0.post0
      - python-dateutil==2.9.0.post0
      - requests==2.32.3
      - rsa==4.0
      - six==1.17.0
      - tomli==2.2.1
      - urllib3==2.3.0
      - werkzeug==3.1.3
      - zipp==3.21.0
prefix: /opt/conda/envs/google-auth-library-python

tests/transport/test_requests.py::TestAuthorizedHttp::test_request_default_timeout
tests/transport/test_requests.py::TestRequestResponse::test_request_basic tests/transport/test_requests.py::TestRequestResponse::test_request_with_timeout_success tests/transport/test_requests.py::TestRequestResponse::test_request_with_timeout_failure tests/transport/test_requests.py::TestRequestResponse::test_request_headers tests/transport/test_requests.py::TestRequestResponse::test_request_error tests/transport/test_requests.py::TestRequestResponse::test_connection_error tests/transport/test_requests.py::TestRequestResponse::test_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_tracks_elapsed_time_w_numeric_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_tracks_elapsed_time_w_tuple_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_noop_if_no_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_timeout_error_w_numeric_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_timeout_error_w_tuple_timeout tests/transport/test_requests.py::TestTimeoutGuard::test_custom_timeout_error_type tests/transport/test_requests.py::TestTimeoutGuard::test_lets_suite_errors_bubble_up tests/transport/test_requests.py::TestAuthorizedHttp::test_constructor tests/transport/test_requests.py::TestAuthorizedHttp::test_constructor_with_auth_request tests/transport/test_requests.py::TestAuthorizedHttp::test_request_no_refresh tests/transport/test_requests.py::TestAuthorizedHttp::test_request_refresh tests/transport/test_requests.py::TestAuthorizedHttp::test_request_max_allowed_time_timeout_error tests/transport/test_requests.py::TestAuthorizedHttp::test_request_max_allowed_time_w_transport_timeout_no_error tests/transport/test_requests.py::TestAuthorizedHttp::test_request_max_allowed_time_w_refresh_timeout_no_error tests/transport/test_requests.py::TestAuthorizedHttp::test_request_timeout_w_refresh_timeout_timeout_error
google/auth/transport/requests.py
google/auth/transport/requests.py