Skip to content

WIF still fails with jti_reused when plugins are configured after #1407 #1561

Description

@portswigger-jose

Describe the bug

This appears to be the same externally visible failure reported in #1406, despite running a version of the action that includes the fix from #1407.

When Anthropic workload identity federation (WIF) is used together with the plugins and plugin_marketplaces inputs, Claude execution fails with a token-exchange authentication error. The plugin is installed from our own privately hosted Claude Code marketplace rather than a public marketplace.

API Error: Token exchange failed with status 401
{"error":{"type":"authentication_error","message":"Authentication failed"}}

The corresponding Anthropic authentication event reports:

jti_reused

After removing the plugin inputs while retaining WIF, a subsequent run completed successfully.

Version evidence

The failing run resolved anthropics/claude-code-action@v1 to be7b93b, which is three commits after the merged #1407 fix.

To reproduce

The relevant shape of the workflow is:

permissions:
  id-token: write
  contents: read

steps:
  - uses: actions/checkout@v4

  - uses: anthropics/claude-code-action@v1
    with:
      prompt: "Perform the requested task."
      anthropic_federation_rule_id: "fdrl_***"
      anthropic_organization_id: "***"
      anthropic_service_account_id: "svac_***"
      anthropic_workspace_id: "wrkspc_***"
      plugin_marketplaces: |
        <marketplace URL>
      plugins: |
        <plugin>@<marketplace>

Observed behaviour:

  1. WIF and a plugin from a privately hosted custom Claude Code marketplace are configured.
  2. The action starts but Claude execution subsequently fails with a token-exchange 401.
  3. The Anthropic authentication event identifies the failure as jti_reused.
  4. Removing the plugin configuration while retaining WIF allows a subsequent run to succeed.

The repository, plugin identity, marketplace URL, federation identifiers, request IDs, and workflow run URLs are intentionally omitted because they are private. The marketplace is supplied through the action's documented plugin_marketplaces input. We can provide additional redacted logs or identifying details privately if required.

Expected behaviour

WIF should continue to work when marketplace plugins are configured.

The identity token should not be exchanged more than once by the separate Claude processes involved in marketplace setup, plugin installation, and the main query.

Additional context

This report follows:

We are not asserting that the internal cause is definitely identical to #1406. However, the observable conditions and failure are the same:

  • WIF succeeds without plugin configuration.
  • With plugin configuration, the run produces jti_reused.
  • The failure occurs on a revision containing the intended shared-credential-cache fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions