Build1 distinct publisher2 min readPublished
A dev.to walkthrough wires Cursor's local OIDC socket to Vault's JWT auth. The resulting credential chain tops out at 35 minutes, and the KV mount is still the only real boundary.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The number worth holding onto is the ceiling on how long anything valuable exists. A minted JWT lives five minutes and cannot be refreshed [3]. The Vault token it buys is capped at thirty [9]. Worst case, mint to expiry, that is thirty-five minutes of usable credential [20], sitting in a VM that is being deleted anyway. The token in the secrets tab has no ceiling at all; it lasts until someone remembers it [2].
What replaces the secret is a signature check plus claim binding. The audience string is shared, defaults to `vault`, and the author states plainly it is not a secret, only a value that must match on both sides [10]. The parts doing the work are the RS256 signature, verified against a JWKS that Vault pulls itself [5], and the role's `bound_subject` and `repo_url` [9]. That also moves the firewall hole. The agent needs egress to Vault and nothing else [6], while the Vault cluster now needs to reach Cursor's discovery endpoint [8]. Anyone who has locked down outbound traffic on their Vault nodes will feel that before they feel anything else.
Two configuration traps in the write-up are worth more attention than the Terraform. Putting `cloud_agent_id` in `bound_claims` produces a role tied to a single run, which dies with the VM; it belongs in `claim_mappings`, for audit [11]. And on a personal account, mapping `team_id` or `automation_id` fails login outright, because a mapped claim that is absent from the token is fatal [12]. Both mistakes fail closed. You get a broken agent, not a quietly over-permitted one, which is the better direction for an error to point.
Containment is where the design is still honest about being early. The policy grants read across `cursor-kv/data/*`, so anything holding it reads every path under the mount, and the author says as much: the mount is the isolation boundary for now [15]. The second role, `cursor-automation`, binds `automation_id` instead of `sub` but carries the same policy [14], so the precision in the bindings decides who may log in, not what they may read [21]. Add that the JWT names the run rather than a process, and any process on the VM can mint one [17], and the policy has to be sized for the least trustworthy command the agent executes. The shape is familiar: this is the same discovery-plus-bound-issuer-plus-role arrangement Vault already uses for HCP Terraform dynamic credentials [18], installed as new mounts and roles alongside whatever you already run [19].
Ranked by verification strength, evidence, and original report placement.
Cursor Cloud Agents give the user an agent in an ephemeral environment they control, often with one click.
Cursor's embedded secrets tab reproduces the foothold problem: a long-lived Vault token sitting in an agent environment until you remember to rotate it.
A cloud agent mints an OIDC JWT by POSTing {"aud":"$VAULT_AUDIENCE"} to a unix socket that only exists on cloud-agent VMs (CURSOR_AGENT_SOCKET, default /run/cursor/api.sock); the response is an RS256 JWT with a 5 minute TTL and no refresh, so it should be minted immediately before login.
Minting is local to the VM: there is no Cursor API call from Vault and no callback.
The issuer is https://api.cursor.com and the JWKS is at https://api.cursor.com/keys; Vault fetches the discovery document and JWKS on its own.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Concrete config, one unverified source
The mechanism is documented at implementation depth — a working curl mint command, named socket and env var, issuer and JWKS URLs, and complete Terraform for the backend, both roles, the kv-v2 mount and the policy — which is stronger than assertion. But it is a single dev.to walkthrough with no vendor documentation, second account, or test output in the cluster, and its two comparative/capability claims (Vault's bindable Cursor claim set, equivalence with HCP Terraform dynamic credentials) are unsupported by any supplied reference.
No adoption signal
The supplied source describes a personal-account demo with a non-sensitive proof value and explicitly advises against putting real secrets in the mount while the pattern is being proven out. No release, deployment, usage disclosure, benchmark or third-party implementation is reported, so adoption cannot be scored.
Mildly overstated
The framing that 'the static token goes away' and that the agent leaves 'no static credential behind' runs slightly ahead of what the supplied detail shows: the residual credential window is 35 minutes rather than zero, operator-side VAULT_ADDR/VAULT_TOKEN still live outside the agent, any process in the run can mint, and one shared read policy over the whole KV mount is still the only isolation boundary. The overstatement is small because the author himself flags the mount boundary as provisional, warns against real secrets, and shows the TTLs that bound the claim.
Incentives undisclosed
The cluster provides no information about the author's affiliation, sponsorship, employment or commercial relationship with Cursor or HashiCorp, and contains no pricing, licensing or promotional offer. Scoring incentive pressure would require inferring facts the source does not supply.
Low-moderate
Internal consistency is good and the derived arithmetic follows directly from stated TTLs, so the mechanism is likely reported accurately. Confidence is nonetheless held down by single-publisher sourcing, dependence on an undocumented-in-cluster Cursor socket contract that could change without notice, absence of any adoption or incentive signal, and the author's own 'for now' hedges on the isolation boundary.
invest
Cursor ships Origin to paying users as GitHub's outage count reaches 2571 distinct publisher
build
Superpowers makes spec-driven work a precondition, then ships it to twelve harnesses1 distinct publisher
security
GitLab 19.3 puts agent runtime, inference models and secrets under one permission model1 distinct publisher
build
Your agent needs the API call, not the API key1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 25, 2026