Skip to content

Commit 18f8970

Browse files
authored
feat(FS-1981): connector oauth refresh (#708)
<!-- CURSOR_SUMMARY --> > [!NOTE] > **Low Risk** > Low risk schema-only change: adds new optional config fields and updates documentation/versioning, with no runtime token refresh behavior added here. > > **Overview** > Bumps the library version to `1.6.1` and documents the change in `CHANGELOG.md`. > > Adds an optional `refresh_token` field to `GoogleDriveAccessConfig`, `GcsAccessConfig`, `OnedriveAccessConfig`, and `OutlookAccessConfig` so the platform can persist refresh tokens alongside access tokens (and removes wording that these connectors do not refresh tokens). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 3130452. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 29ca4a4 commit 18f8970

6 files changed

Lines changed: 33 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [1.6.1]
2+
3+
### Enhancements
4+
5+
- **feat(oauth): add `refresh_token` field to Google Drive, GCS, OneDrive, SharePoint, and Outlook AccessConfigs.** Allows the platform to persist and retrieve OAuth refresh tokens alongside access tokens, enabling automatic token refresh before job dispatch. Dropbox already had this field.
6+
17
## [1.6.0]
28

39
### Enhancements

unstructured_ingest/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.6.0" # pragma: no cover
1+
__version__ = "1.6.1" # pragma: no cover

unstructured_ingest/processes/connectors/fsspec/gcs.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ class GcsAccessConfig(FsspecAccessConfig):
7272
default=None, description=service_account_key_description
7373
)
7474
token: Union[str, dict, None] = Field(init=False, default=None)
75+
refresh_token: Optional[str] = Field(
76+
default=None,
77+
description="OAuth 2.0 refresh token for obtaining new access tokens. "
78+
"Long-lived; used by the platform to refresh expired access tokens "
79+
"before each job run.",
80+
)
7581

7682
def model_post_init(self, __context: Any) -> None:
7783
ALLOWED_AUTH_VALUES = "google_default", "cache", "anon", "browser", "cloud"

unstructured_ingest/processes/connectors/google_drive.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ class GoogleDriveAccessConfig(AccessConfig):
6969
"Obtain via Google OAuth Playground or your OAuth application. "
7070
"Tokens typically expire after 1 hour.",
7171
)
72+
refresh_token: Optional[str] = Field(
73+
default=None,
74+
description="OAuth 2.0 refresh token for obtaining new access tokens. "
75+
"Long-lived; used by the platform to refresh expired access tokens "
76+
"before each job run.",
77+
)
7278

7379
def model_post_init(self, __context: Any) -> None:
7480
has_service_account = (

unstructured_ingest/processes/connectors/onedrive.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,15 @@ class OnedriveAccessConfig(AccessConfig):
6060
default=None,
6161
description=(
6262
"OAuth 2.0 access token for delegated user authentication. "
63-
"Tokens typically expire after ~1 hour; this connector does not "
64-
"refresh tokens."
63+
"Tokens typically expire after ~1 hour."
6564
),
6665
)
66+
refresh_token: Optional[str] = Field(
67+
default=None,
68+
description="OAuth 2.0 refresh token for obtaining new access tokens. "
69+
"Long-lived; used by the platform to refresh expired access tokens "
70+
"before each job run.",
71+
)
6772

6873
def model_post_init(self, __context: Any) -> None:
6974
# Use truthiness so empty strings (e.g. from unset env vars) are treated

unstructured_ingest/processes/connectors/outlook.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,15 @@ class OutlookAccessConfig(AccessConfig):
4545
default=None,
4646
description=(
4747
"OAuth 2.0 access token for delegated user authentication. "
48-
"Tokens typically expire after ~1 hour; this connector does not "
49-
"refresh tokens."
48+
"Tokens typically expire after ~1 hour."
5049
),
5150
)
51+
refresh_token: Optional[str] = Field(
52+
default=None,
53+
description="OAuth 2.0 refresh token for obtaining new access tokens. "
54+
"Long-lived; used by the platform to refresh expired access tokens "
55+
"before each job run.",
56+
)
5257

5358
def model_post_init(self, __context: Any) -> None:
5459
# Use truthiness so empty strings (e.g. from unset env vars) are treated

0 commit comments

Comments
 (0)