| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Adds samples/update_connection_to_keypair.py demonstrating how to convert an existing Tableau Cloud datasource or workbook connection from username/password to Snowflake keypair authentication using the REST API v3.27 flow. Documents the prerequisite that the private key must first be saved under Site Settings -> Saved Credentials for Data Sources on the site. Refs tableau#1602 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior comment said embed_password=True "tells the server to use the pre-saved credential" which was vague. Server code (RestApiAppService updateConnectionImpl -> embedOAuthUserKeychainConnections) looks up the credential by (dbClass, username, role, auth) and binds it to the connection; without that pre-saved match, the update still writes 'auth-keypair' into metadata but subsequent extract refreshes fail. Spell that out so a copy-paste reader knows what "pre-saved" actually requires. Also add a note that flow connections gained the same capability in REST API v3.28 (datasources and workbook connections were v3.27). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
update_connection_auth.py already covers exactly this workflow (change a connection's auth_type + credentials via the update-connection endpoint). The prior keypair-specific sample added no new code path -- only Snowflake-keypair context that belongs in the shared sample's header. Delete the dedicated keypair sample; expand update_connection_auth's header comment to list common authentication_type values (including auth-keypair) and to spell out the pre-saved-credential prerequisite that applies to any embed_password=True conversion. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
This PR aims to improve guidance for converting Tableau Cloud content connections from Snowflake username/password authentication to Snowflake keypair authentication, addressing the request in #1602 with an end-to-end example.
Changes:
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Sorry, something went wrong.
…ST ref
Round-1 review of update_connection_auth.py header caught three real
inaccuracies and one missing security note:
- "Username Password" was not the wire value; it's "UsernamePassword"
(confirmed against test/assets/datasource_connections_update_no_auth.xml,
test/assets/workbook_update_connections_no_auth.xml, and the
UsernamePassword assertions in test_datasource.py and test_workbook.py).
- "oauth" had no grep-able backing as an authentication_type wire value
on this endpoint. Dropped.
- "sqlserver" is a connection type (type=), not an authentication_type
wire value. Dropped.
- v3.27 (datasource/workbook) and v3.28 (flow) version claim had no
code backing -- @api decorators on update_connection are 2.3 for
datasource/workbook and 3.3 for flow. Dropped rather than restating.
- Added a SECURITY callout: datasource_password is a positional CLI
argument, so private-key material passed there leaks to shell
history, ps output, and audit logs.
- Added the workbooks_and_views REST reference alongside the
data-sources one; this sample updates both.
- Softened the credential lookup-key description ("attributes
including..." instead of asserting a specific tuple).
Docs-only. samples/update_connection_auth.py parses cleanly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior list included "UsernamePassword" (one word) as a canonical value. Grepping the monolith source of truth shows that string is not a valid authentication_type -- it does not appear in codegen/constants.data, in the connection.authentication values that Tableau Desktop writes into .tds/.twb, or in the REST reference docs. It is only present in TSC's hand-authored test fixtures, where it survives round-trip tests because TSC doesn't validate the string -- so a sample-user who copies it and posts to a real server hits an unhelpful rejection. Replaced with the actual documented set from codegen/constants.data and the public REST reference: - auth-user-pass (canonical username+password) - username-password (SAP HANA / Sybase ASE / NetWeaver / Denodo / Salesforce) - auth-keypair (Snowflake keypair) - oauth - auth-none - AD Service Principal - Azure AD Password TSC's `UsernamePassword` test fixtures are a separate follow-up -- they don't break tests, but they steer future readers wrong.
| Back | FazBrowse Home | New Git URL |
Closes #1602.
Motivation
#1602 asked for an end-to-end example of converting a Tableau Cloud
datasource or workbook connection from Snowflake username/password auth
to keypair auth. The existing update_connection_auth.py already runs
the right code path -- it takes authentication_type as an arg and
sets embed_password=True. What it was missing was context: which
authentication_type strings are common, and the pre-saved-credential
prerequisite that applies to any embed_password conversion.
Initial draft of this PR added a dedicated keypair sample; folded that
into a header-comment update on update_connection_auth.py after
noticing the code duplication. See 949d602 for the fold-in.
Behavior change
Samples only -- no library changes. Adds a ~25-line header comment to
samples/update_connection_auth.py:
oauth, AD Service Principal, sqlserver, and Username Password
matching pre-saved credential on the site, looked up by
(username, connection class, role)
be saved on the site under Site Settings -> Saved Credentials for
Data Sources before the sample runs. Without it, the update writes
the new auth type into metadata but subsequent extract refreshes
and connection tests fail.
connections, v3.28 for flows)
Test plan
Docs-only change to a sample; no automated tests exist for samples/.
same args (help output unchanged)
private-key credential, run the sample with
authentication_type=auth-keypair; connection's auth_type flips
and extract refresh succeeds
post-update as documented
🤖 Generated with Claude Code