From b9efbe6f9d08fa15ce2441820326cfa17adb1b5e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 23:42:24 +0000 Subject: [PATCH 1/2] fix: improve OAuth refresh token rejection error message Co-Authored-By: bot_apk --- .../http/requests_native_auth/abstract_oauth.py | 12 +++++++++--- .../test_requests_native_auth.py | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py b/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py index 7ebb429b76..446129ac54 100644 --- a/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +++ b/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py @@ -334,10 +334,16 @@ def _make_handled_request(self) -> Any: failure_type=FailureType.transient_error, ) if self._wrap_refresh_token_exception(e): - message = "Refresh token is invalid or expired. Please re-authenticate from Sources//Settings." - raise AirbyteTracedException( - internal_message=message, message=message, failure_type=FailureType.config_error + response_info = ( + f"HTTP {e.response.status_code}: {e.response.text}" + if e.response is not None + else str(e) ) + raise AirbyteTracedException( + internal_message=f"Refresh token rejected by the OAuth token endpoint. {response_info}", + message="Refresh token was rejected by the OAuth provider (invalid, expired, or already used). Re-authenticate this source's credentials in its connection settings.", + failure_type=FailureType.config_error, + ) from e raise except Exception as e: raise AirbyteTracedException( diff --git a/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py b/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py index 0eabac2678..3a7cb8d3d6 100644 --- a/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +++ b/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py @@ -642,8 +642,12 @@ def test_refresh_access_token_wrapped( oauth.refresh_access_token() if wrapped: - error_message = "Refresh token is invalid or expired. Please re-authenticate from Sources//Settings." - assert exc_info.value.internal_message == error_message + error_message = "Refresh token was rejected by the OAuth provider (invalid, expired, or already used). Re-authenticate this source's credentials in its connection settings." + assert exc_info.value.internal_message.startswith( + "Refresh token rejected by the OAuth token endpoint." + ) + assert f"HTTP {response_code}" in exc_info.value.internal_message + assert response_value in exc_info.value.internal_message assert exc_info.value.message == error_message assert exc_info.value.failure_type == FailureType.config_error From e91bda4c45fea8db631edb511939de1440fa9f20 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 23:46:43 +0000 Subject: [PATCH 2/2] fix: truncate OAuth provider response details Co-Authored-By: bot_apk --- .../sources/streams/http/requests_native_auth/abstract_oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py b/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py index 446129ac54..eae5be13a1 100644 --- a/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +++ b/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py @@ -335,7 +335,7 @@ def _make_handled_request(self) -> Any: ) if self._wrap_refresh_token_exception(e): response_info = ( - f"HTTP {e.response.status_code}: {e.response.text}" + f"HTTP {e.response.status_code}: {e.response.text[:1000]}" if e.response is not None else str(e) )