Skip to content

Commit 6941512

Browse files
Shorten WIF entries in CHANGELOG.md to match house style
The two WIF entries added by #1887 and #1894 were ~34 and ~56 lines; every other entry in the file is 2-9 lines. Compressed both to ~13 lines each, keeping the headline capability, the key constraints (server version, auth, side-effects), and the gotchas callers must know (reject non-UUID; resend `workgroup_auth_mode`); moved the full method-by-method surface area to the API docs on gh-pages where it belongs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 83b8c14 commit 6941512

1 file changed

Lines changed: 20 additions & 82 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 20 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -2,90 +2,28 @@
22
## Unreleased
33

44
* Added Workload Identity Federation (WIF) admin REST API support
5-
(`server.auth_federation`). Site admins can now manage the WIF config and
6-
its signing keys and connectors from TSC. New endpoints:
7-
- `server.auth_federation.get()` -> `AuthFederationItem` — read the
8-
site's WIF admin config (enabled flag, issuer URL, active key id,
9-
JWT lifetime, connectors). A never-enabled site returns a shell with
10-
`enabled=False` rather than 404.
11-
- `server.auth_federation.enable(token_lifetime_seconds=None)` ->
12-
`AuthFederationItem` — idempotent PUT. Server auto-generates one active
13-
signing key on first enable.
14-
- `server.auth_federation.update(token_lifetime_seconds)` ->
15-
`AuthFederationItem` — merge-patch; only `token_lifetime_seconds` is
16-
mutable (required), so `update()` always changes it. `enabled` is never
17-
sent on PATCH; use `enable()` / `delete()` to change WIF state.
18-
- `server.auth_federation.delete()` — permanently deletes the WIF config
19-
along with every signing key and connector on the site. A subsequent
20-
`enable()` starts from a clean slate; prior connectors and keys are
21-
not restored.
22-
- `server.auth_federation.create_connector(connector)` ->
23-
`AuthFederationConnectorItem`. `connector_class` must match a Tableau
24-
connection type exactly (case-sensitive, e.g. `"bigquery"`,
25-
`"snowflake"`). Fails with 409 if a connector with the same class
26-
already exists on the site.
27-
- `server.auth_federation.list_connectors()` -> `list[AuthFederationConnectorItem]`
28-
- `server.auth_federation.get_connector(id)` and
29-
`server.auth_federation.delete_connector(id)` accept either a connector
30-
LUID string or an `AuthFederationConnectorItem` with `luid` set. All
31-
id-taking methods reject `None`, empty strings, and non-UUID-shaped
32-
targets client-side (raising `ValueError`) to prevent path injection.
33-
- `server.auth_federation.create_key()` -> `AuthFederationKeyItem` —
34-
generates a new (inactive) signing key; private key is never returned.
35-
Fails with 400 if the site is already at the maximum number of keys.
36-
- `server.auth_federation.activate_key(id)` /
37-
`server.auth_federation.deactivate_key(id)` /
38-
`server.auth_federation.delete_key(id)` accept either a `kid` string
39-
or an `AuthFederationKeyItem` with `kid` set; `activate_key` is atomic
40-
and deactivates any previously active key. `delete_key` fails with 400
41-
if the key is currently active. Safe rotation is `create_key()` →
42-
`activate_key(new_kid)`, then retain the old (now-inactive) key in the
43-
site's JWKS until every JWT it signed has expired (upper bound: the
44-
site's current `token_lifetime_seconds`), and only then
45-
`delete_key(old_kid)` — deleting it earlier removes it from the JWKS
46-
and any verifier fetching the key set afterwards will reject still-
47-
unexpired tokens signed with it. `deactivate_key` on the active key
48-
with no replacement leaves the site unable to mint WIF tokens. The four key-management methods are bound to `NO_ACCESS`
49-
server-side, which only rejects OAuth-scope-restricted sessions
50-
(e.g. connected-app JWT) with 401; password and personal-access-token
51-
(PAT) sessions do not carry scopes and are accepted.
52-
Three new exports: `AuthFederationItem`, `AuthFederationConnectorItem`,
53-
`AuthFederationKeyItem`. Requires Tableau Server REST API 3.30+
54-
(Tableau Server 2026.3), the WIF feature enabled on the site, and the
55-
Site Administrator role on the current site; the server returns 403 if
56-
any of those is missing (including on `get()`).
5+
(`server.auth_federation`). Site admins can read, enable, update, and
6+
delete the per-site WIF config and manage its connectors (BigQuery,
7+
Snowflake, ...) and signing keys (create / activate / deactivate /
8+
delete). Three new exports: `AuthFederationItem`,
9+
`AuthFederationConnectorItem`, `AuthFederationKeyItem`. All id-taking
10+
methods reject non-UUID targets client-side (raising `ValueError`) to
11+
prevent path injection. Requires Tableau Server REST API 3.30+ (Tableau
12+
Server 2026.3) and Site Administrator on the current site; the server
13+
returns 403 if WIF is not enabled on the site or the caller is not an
14+
admin (including on `get()`).
5715
* Added Workload Identity Federation (WIF) support to the connection update
5816
endpoints. `ConnectionItem` has two new string properties,
59-
`workgroup_auth_mode` and `auth_federation_service_account`, that are
60-
emitted on the `<connection>` payload by `workbooks.update_connection`,
61-
`workbooks.update_connections`, `datasources.update_connection`,
62-
`datasources.update_connections`, and `flows.update_connection`. The two
63-
bulk endpoints also accept matching `workgroup_auth_mode` and
64-
`auth_federation_service_account` keyword arguments and apply them to
65-
every connection LUID in the request. Set `workgroup_auth_mode` to one of
66-
the values on the new nested value set
67-
`ConnectionItem.WorkgroupAuthMode`:
68-
- `ConnectionItem.WorkgroupAuthMode.WIF` =
69-
`"workload-identity-federation"` — direct WIF, e.g. Snowflake
70-
- `ConnectionItem.WorkgroupAuthMode.WIF_IMPERSONATION` =
71-
`"workload-identity-federation-impersonation"` — impersonation WIF,
72-
e.g. Google BigQuery
73-
Usage rules:
74-
- Resend `workgroup_auth_mode` on every subsequent update of a WIF
75-
connection; omitting it on a later update returns HTTP 400.
76-
- Leave `auth_type` unset (or `"oauth"`) when sending a WIF mode; the
77-
server derives the stored auth type from the mode.
78-
- Set `auth_federation_service_account` only with `WIF_IMPERSONATION`.
79-
The server rejects a service account with the direct `WIF` mode. TSC
80-
does not validate this combination client-side.
81-
- The server does not echo these attributes on GET responses today, so
82-
`ConnectionItem.workgroup_auth_mode` and
83-
`ConnectionItem.auth_federation_service_account` parsed from a response
84-
will typically be `None` even when the connection is WIF-configured.
85-
Requires Tableau Server REST API 3.30+ (Tableau Server 2026.3) with
86-
WIF configured and enabled on the site. Older servers silently ignore
87-
unknown connection attributes, so these fields are safe to leave unset on
88-
pre-3.30 targets.
17+
`workgroup_auth_mode` and `auth_federation_service_account`, emitted on
18+
the `<connection>` payload by `workbooks.update_connection(s)`,
19+
`datasources.update_connection(s)`, and `flows.update_connection`. Set
20+
`workgroup_auth_mode` to `ConnectionItem.WorkgroupAuthMode.WIF` (direct,
21+
e.g. Snowflake) or `WIF_IMPERSONATION` (e.g. BigQuery);
22+
`auth_federation_service_account` is only valid with the impersonation
23+
mode. Omitting `workgroup_auth_mode` on a subsequent update of a WIF
24+
connection returns HTTP 400. Requires Tableau Server REST API 3.30+
25+
(Tableau Server 2026.3) with WIF configured on the site; older servers
26+
silently ignore unknown connection attributes.
8927
* Bumped the urllib3 floor to 2.6.3 to pick up the fix for CVE-2026-21441
9028
(GHSA-38jv-5279-wg99, 8.9 High): urllib3's streaming decompression
9129
safeguards were bypassed when HTTP redirects were followed. TSC's manual

0 commit comments

Comments
 (0)