airbytehq / airbytehq/airbyte-python-cdk

[Declarative Source] SessionTokenProvider should support reading session token from text/plain auth response

Open
#404 0 comments 0 reactions 0 assignees View on GitHub
community
Dominant language
Python
Stars
26
Forks
53
Avg merge
2d 6h
Merged PRs (30d)
10

Description

## Component
SessionTokenProvider

## Relevant information
Currently, the [SessionTokenProvider](https://github.com/airbytehq/airbyte-python-cdk/blob/969dec1d2f2f22d821b3abcb420c149e0354ed35/airbyte_cdk/sources/declarative/auth/token_provider.py#L32) used in the SessionTokenAuthenticator only supports reading the session token from [JSON/XML](https://github.com/airbytehq/airbyte-python-cdk/blob/969dec1d2f2f22d821b3abcb420c149e0354ed35/airbyte_cdk/sources/declarative/models/declarative_component_schema.py#L2062). This limits compatibility with older / legacy APIs which sometimes return the session token in the body as text/plain.

e.g. see [slack thread](https://airbytehq.slack.com/archives/C027KKE4BCZ/p1741577205250339) in Community Slack channel.

## Proposed solution
Provide a dummy TextDecoder class which can be used in token [refresh method](https://github.com/airbytehq/airbyte-python-cdk/blob/969dec1d2f2f22d821b3abcb420c149e0354ed35/airbyte_cdk/sources/declarative/auth/token_provider.py#L66) to conditional return response.text if decoder isinstance of TextDecoder.

```
class SessionTokenProvider(TokenProvider):
...

def _refresh(self) -> None:
response = self.login_requester.send_request(
log_formatter=lambda response: format_http_message(
response,
"Login request",
"Obtains session token",
None,
is_auxiliary=True,
type="AUTH",
),
)
if response is None:
raise ReadException("Failed to get session token, response got ignored by requester")
session_token = dpath.get(next(self.decoder.decode(response)), self.session_token_path) if not isinstance(self.decoder, TextDecoder) else response.text
if self.expiration_duration is not None:
self._next_expiration_time = ab_datetime_now() + self.expiration_duration
self._token = session_token # type: ignore # Returned decoded response will be Mapping and therefore session_token will be str or None
```

✅ Yes, I want to contribute

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.