chore(deps): upgrade authkestra 0.5.1 -> 0.5.4 - #10
Merged
Conversation
Moves all four pinned authkestra-* crates (op, engine, axum, resource) in lockstep to 0.5.4, preserving the exact-pin + rustls-no-provider configuration and its rationale comments. Two security fixes land in this range: - fix(op): validate requested audience against allowed_audiences in client_credentials (authkestra#230) — vpay never calls handle_client_credentials (no OP flow is wired up yet; this is a dependency spike), so it was not exposed. - fix(oidc): derive ID-token Validation from discovery instead of Validation::default() (authkestra#228) — lives in authkestra-oidc, which vpay does not depend on. vpay's own resource-token validation (vpay-api/src/resource_auth.rs) hand-rolls jsonwebtoken::Validation with an explicit set_audience, never Validation::default(). Also in range: private_key_jwt client auth for ClientCredentialsFlow (#229, touches authkestra-op/src/client_assertion.rs but only converts two pub const to pub use re-exports of the same types — source compatible), revocation_endpoint on OidcDiscovery (#226, additive), E2E adapter tests (#232), cargo-deny (#96a00e6/#219), a CI drift fix (#d896fc7), and 0.5.4's RFC 8705 cert-bound access tokens (#231, additive: existing handle_token keeps its 5-arg signature, cert binding lands in a new handle_token_with_client_cert). Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Bumps all four pinned
authkestra-*crates (authkestra-op,authkestra-engine,authkestra-axum,authkestra-resource) inCargo.tomlfrom=0.5.1to=0.5.4in lockstep, per the pinning discipline the rootCargo.toml's own comment documents ("pre-1.0, fast-moving... the whole family must move in lockstep").authkestra-devsigis not a vpay dependency — grepped and confirmed absent from bothCargo.tomlandCargo.lock. Thedefault-features = false, features = ["rustls-no-provider"]configuration and its surrounding rationale comments (single-ring-CryptoProvider constraint) are unchanged.Source of truth: https://github.com/marcjazz/authkestra/releases/tag/authkestra-v0.5.4 (10-commit range
authkestra-v0.5.1..authkestra-v0.5.4, read directly from the cloned authkestra source at/Users/selast/dev/authkestra, not from a changelog).Scope
Read all 10 commits in range and diffed the actual API surface vpay touches (
authkestra_op::{client_assertion, sqlx_store, store},authkestra_engine::client_assertion,authkestra_resource::jwt::{JwksCache, ValidationError, validate_jwt_generic, Jwk}) rather than trusting commit prose:8644cb5fix(op): validate requested audience againstallowed_audiencesinclient_credentials(#230) — before this fix,handle_client_credentialsalways stampedaud = client_id, ignoringreq.audience/client.allowed_audiencesentirely (no audience-scoping enforcement at all, not "requests to any audience accepted" — either way vpay's exposure question is the same). vpay is not exposed: grepped the whole workspace forhandle_client_credentials— zero call sites. vpay's authkestra-op usage today is a persistence-layer spike only (vpay-dbimplementsClientAssertionStore/SqlxOpStoreplumbing for a future OP;backends/tests/integration/tests/authkestra_op_smoke.rsexercisesSqlxOpStore/AuthorizationCodeStore/ClientStoreat the storage layer). No OP router is mounted, no client_credentials grant is ever handled by vpay's own running code, andauthkestra-axum— the crate that would mount OP routes onto a Router — isn't even a real dependency edge (declared in[workspace.dependencies], absent fromCargo.lockboth before and after this bump; nothing depends on it).884d4a9fix(oidc): derive ID-tokenValidationfrom discovery instead ofValidation::default()(#228) — touches onlycrates/authkestra-oidc/src/provider.rs, a crate vpay does not depend on (not in the four pinned crates). Separately, vpay's own resource-token validation (backends/crates/vpay-api/src/resource_auth.rs) does not use authkestra's ID-token validation at all — it hand-buildsjsonwebtoken::Validation::new(Algorithm::RS256)and calls.set_audience(&[surface.audience()])explicitly (see the file's own doc comment explaining whyauthkestra_resource::jwt::JwtStrategywas deliberately not used: itsValidationis opaque once built viaValidationConfigBuilder). vpay was never exposed to either theauthkestra-oidcdefault-permissive validation or its fix, because it never called into that code path.Also in range, all non-breaking for vpay's usage:
b206bc3private_key_jwtclient auth forClientCredentialsFlow(#229) — touchesauthkestra-op/src/client_assertion.rs, but only convertsCLIENT_ASSERTION_TYPE_JWT_BEARER/MAX_CLIENT_ASSERTION_LIFETIME_SECSfrompub consttopub usere-exports of the identically-typed constants inauthkestra-engine— source compatible,vpay-db/src/client_assertion.rs'sClientAssertionStoreimpl is untouched.4daeb25revocation_endpointadded toOidcDiscovery(#226) — additive field onauthkestra-op/src/handlers/discovery.rs; vpay does not construct or readOidcDiscovery.571b904E2E adapter tests (#232),96a00e6cargo-deny setup,d896fc7CI lint/deny drift fix — all internal to authkestra's own CI/tests, no API surface change.f2ac3e4RFC 8705 certificate-bound access tokens forclient_credentials(0.5.4, #231) — newauthkestra_engine::token::cert_bindingmodule and a newhandle_token_with_client_cert, added alongside the existing 5-argumenthandle_token/handle_client_credentials, which keep their original signatures ("every existing call site keeps compiling untouched", confirmed by diff — no call site in vpay to begin with anyway).authkestra-resource'sValidationConfiggains an opt-inrequire_cert_bindingfield (off by default); vpay doesn't constructValidationConfigso this is a no-op for vpay.cargo diff --statof the store/discovery/jwt-generic surface confirmsauthkestra-op/src/{store,sqlx_store,lib}.rsandauthkestra-resource/src/jwt.rs'svalidate_jwt_generic/JwksCachefunction signatures are untouched in this range — onlyauthkestra-resource/src/jwt.rsgrew (opt-inValidationConfig/JwtStrategyadditions vpay doesn't use) andauthkestra-enginegained the newcert_bindingmodule.Net: this bump is mechanical for vpay. No code changes required beyond the four version pins.
Verification
Baseline established first on a clean
origin/master(16c3663) before making any change —cargo build --workspace,cargo fmt --all -- --check, andcargo clippy --workspace --all-targets -- -D warningsall passed clean, andcargo nextest run --workspacepassed 139/139 (3 skipped). No pre-existing failures to distinguish from.With the bump applied:
cargo build --workspace— clean,Finisheddevprofile [unoptimized + debuginfo] target(s) in 5.96s.cargo fmt --all -- --check— clean, zero diff.cargo clippy --workspace --all-targets -- -D warnings— clean, zero warnings.cargo nextest run --workspace(matches CI'srustjob) —Summary [ 25.729s] 139 tests run: 139 passed, 3 skipped, identical pass count to baseline. Includes the Postgres-backed suites CI cares about:vpay-tests-integration::authkestra_op_smoke::sqlx_op_store_round_trips_a_client_and_enforces_single_use_codesand all 14vpay-tests-integration::postgres_smoke::*tests, run against realpostgres:16-alpinetestcontainers per.config/nextest.toml's serializedpostgres-containersgroup (Docker was available locally; ran for real, not skipped).cargo deny check—advisories FAILED(RUSTSEC-2026-0258,h2v0.4.15, low severity, unbounded empty DATA frames, pulled in viatestcontainers→bollard→tonic/hyper, a dev-only dependency chain). Pre-existing onorigin/masterbefore this PR — confirmed by running the identicalcargo deny check advisorieson a stash of this change (i.e. against unmodifiedmaster), which fails identically.git diff Cargo.lockconfirmsh2is untouched by this bump (only the threeauthkestra-*entries change version/checksum, plusauthkestra-resourcegains atracingdependency edge per upstream commitf2ac3e4). Not fixed here — out of scope for an authkestra version bump, and unrelated to either flagged security fix;bans,licenses, andsourcesall reportok.Risk Assessment
Low. Exact-pin dependency bump within a pre-1.0 crate family vpay does not yet wire into any running code path (dependency spike per
docs/adr/0009-dashboard-oidc-provider.md) — no OP router mounted, no client_credentials handler called, ID-token validation is vpay's own hand-rolledjsonwebtoken::Validation, not authkestra's. Full local test suite (including real-Postgres integration tests) passes identically to baseline.AI Usage Declaration
authkestrasource (cloned locally), impact assessment against vpay's actual call sites (not just changelog prose), and this PR description.Cargo.toml,Cargo.lock).resource_auth.rs,client_assertion.rs, the integration test files) rather than trusting the commit messages alone.Reviewer Focus
handle_client_credentials/ never validates ID tokens via authkestra-oidc" exposure conclusion independently if you want a second read — the grep commands are reproducible:grep -rn "handle_client_credentials\|authkestra_oidc" backends/.cargo deny'sh2/RUSTSEC-2026-0258 failure is real but pre-existing and out of scope here; flagging in case it isn't already tracked separately.🤖 Generated with Claude Code