Skip to content

turso: ?authToken= in an authored config.url / config.syncUrl query string is credential material the #8082 userinfo refusal does not cover #8337

Description

@hotlong

Found while implementing #8082 (session session_01Euoy6wyfzgiWtgCg4s6JK2). #8082 closes the user:password@host userinfo door on authored driver URLs. libSQL has a second URL syntax for the same secret: libsql://x.turso.io?authToken=eyJ... — the @libsql/client accepts an auth token as a URL query parameter, and the turso driver hands the authored url (and syncUrl) to createClient as-is (packages/drivers/driver-turso/src/turso-driver.ts).

So an author refused on config.authToken (#8078) and on URL userinfo (#8082) still has a one-syntax-over spelling that (a) persists the JWT cleartext into sys_metadata — certain, independent of the client — and (b) plausibly authenticates at connect. That is the same workaround-shape #8082's ruling template exists to close ("close the forward door"), one query-parameter over.

Not measured end-to-end: I verified the driver passes the URL through untouched, but did not stand up a libSQL server to confirm the client honors ?authToken= from an authored URL in our composition. The at-rest cleartext half does not depend on that; the connect half should be measured before choosing the fix.

Suggested shape (for triage)

Extend the #8082 shared value-level parse (urlUserinfoPassword / credentialFreeUrl, packages/spec/src/data/driver/common.zod.ts) with a per-driver list of credential-bearing query parameter names (turso: authToken), refused with the same binder/credentialsRef guidance. Deliberately NOT done inside #8082: the ruling's accept-set change named URL userinfo; widening a published authoring surface's refusal to query parameters is its own small decision.

Also relevant: the read-path redaction (#8126, redactUrlPassword) strips only the userinfo password component — a stored ?authToken= would be served back cleartext by getDatasource(), so the read half needs the same extension if the write half is ruled in.

Refs: #8082 (userinfo ruling + shared parse), #8078 (authToken key refusal), #8126 (read-path redaction), #8152 (bound-secret route for turso).


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions