Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

Commit 908321a

Browse files
Fix: Ensure autogenerate_code_verifier defaults to True in from_client_config (#356)
Ensures that code_verifier is set to a reasonable value. Adds unit tests. Fixes #354 🦕 --------- Co-authored-by: Chalmer Lowe <chalmerlowe@google.com>
1 parent 715ff5a commit 908321a

2 files changed

Lines changed: 14 additions & 9 deletions

File tree

google_auth_oauthlib/flow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def from_client_config(cls, client_config, scopes, **kwargs):
160160

161161
# these args cannot be passed to requests_oauthlib.OAuth2Session
162162
code_verifier = kwargs.pop("code_verifier", None)
163-
autogenerate_code_verifier = kwargs.pop("autogenerate_code_verifier", None)
163+
autogenerate_code_verifier = kwargs.pop("autogenerate_code_verifier", True)
164164

165165
(
166166
session,
@@ -237,7 +237,7 @@ def authorization_url(self, **kwargs):
237237
specify the ``state`` when constructing the :class:`Flow`.
238238
"""
239239
kwargs.setdefault("access_type", "offline")
240-
if self.autogenerate_code_verifier:
240+
if self.code_verifier is None and self.autogenerate_code_verifier:
241241
chars = ascii_letters + digits + "-._~"
242242
rnd = SystemRandom()
243243
random_verifier = [rnd.choice(chars) for _ in range(0, 128)]

tests/unit/test_flow.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
with open(CLIENT_SECRETS_FILE, "r") as fh:
3535
CLIENT_SECRETS_INFO = json.load(fh)
3636

37+
VALID_PKCE_VERIFIER_REGEX = r"^[A-Za-z0-9-._~]{128}$"
38+
VALID_CODE_CHALLENGE_REGEX = r"^[A-Za-z0-9-_]{43}$"
39+
3740

3841
class TestFlow(object):
3942
def test_from_client_secrets_file(self):
@@ -114,10 +117,14 @@ def test_authorization_url(self, instance):
114117

115118
assert CLIENT_SECRETS_INFO["web"]["auth_uri"] in url
116119
assert scope in url
120+
assert "code_challenge=" in url
121+
assert "code_challenge_method=S256" in url
117122
authorization_url_spy.assert_called_with(
118123
CLIENT_SECRETS_INFO["web"]["auth_uri"],
119124
access_type="offline",
120125
prompt="consent",
126+
code_challenge=mock.ANY,
127+
code_challenge_method="S256",
121128
)
122129

123130
def test_authorization_url_code_verifier(self, instance):
@@ -183,10 +190,8 @@ def test_authorization_url_generated_verifier(self):
183190
assert kwargs["code_challenge_method"] == "S256"
184191
assert len(instance.code_verifier) == 128
185192
assert len(kwargs["code_challenge"]) == 43
186-
valid_verifier = r"^[A-Za-z0-9-._~]*$"
187-
valid_challenge = r"^[A-Za-z0-9-_]*$"
188-
assert re.match(valid_verifier, instance.code_verifier)
189-
assert re.match(valid_challenge, kwargs["code_challenge"])
193+
assert re.fullmatch(VALID_PKCE_VERIFIER_REGEX, instance.code_verifier)
194+
assert re.fullmatch(VALID_CODE_CHALLENGE_REGEX, kwargs["code_challenge"])
190195

191196
def test_fetch_token(self, instance):
192197
instance.code_verifier = "amanaplanacanalpanama"
@@ -307,13 +312,13 @@ def test_run_local_server(self, webbrowser_mock, instance, mock_fetch_token, por
307312
assert credentials.id_token == mock.sentinel.id_token
308313
assert webbrowser_mock.get().open.called
309314
assert instance.redirect_uri == f"http://localhost:{port}/"
310-
315+
assert re.fullmatch(VALID_PKCE_VERIFIER_REGEX, instance.code_verifier)
311316
expected_auth_response = auth_redirect_url.replace("http", "https")
312317
mock_fetch_token.assert_called_with(
313318
CLIENT_SECRETS_INFO["web"]["token_uri"],
314319
client_secret=CLIENT_SECRETS_INFO["web"]["client_secret"],
315320
authorization_response=expected_auth_response,
316-
code_verifier=None,
321+
code_verifier=mock.ANY,
317322
audience=None,
318323
)
319324

@@ -352,7 +357,7 @@ def test_run_local_server_audience(
352357
CLIENT_SECRETS_INFO["web"]["token_uri"],
353358
client_secret=CLIENT_SECRETS_INFO["web"]["client_secret"],
354359
authorization_response=expected_auth_response,
355-
code_verifier=None,
360+
code_verifier=mock.ANY,
356361
audience=self.AUDIENCE,
357362
)
358363

0 commit comments

Comments
 (0)