Skip to the content.

RFC 0015: Public Read-Only Verification Endpoints

Summary

Open read-only verification endpoints to anonymous callers for projects in attested mode, so a relying party can verify what’s running without holding the daemon’s admin token.

Problem

Every /_api/* request currently passes through _check_auth in proxy/ingress.py (line 391, called from _handle_api at line 403). That includes endpoints whose entire purpose is to let an external party verify what code is running:

Today all four return 401 missing token to an anonymous caller. The proxy/verify.py CLI documents this by accepting --token — but a relying party does not have the daemon admin’s token, and asking for one defeats the point of attestation.

This blocks the iconic relying-party demo on the project’s front page and breaks the trust chain laid out in RFC 0001.

Files to Modify

Implementation

  1. In _handle_api, do not gate every path through _check_auth. Instead, classify each path before the auth check:
    • Public, always-readable: none yet.
    • Public, attested-only: GET /_api/projects/<name>, GET /_api/projects/<name>/audit, GET /_api/attest/<name>, GET /_api/verification/<name>. Resolve the project; if it exists and mode == "attested", serve. If it does not exist or is in dev mode, return 404 not found (do not leak existence of dev projects).
    • Authenticated: all mutating endpoints (POST, DELETE), plus list endpoints (GET /_api/projects, GET /_api/routes, GET /_api/audit) which would otherwise enumerate dev projects.
  2. Public endpoints that take no project name (e.g., a future GET /_api/instance for the daemon’s own attestation) should also be public. Do not add this in this RFC — keep scope to the per-project endpoints.
  3. Document the public/private split in a docstring on _handle_api so the rule is reviewable in one place.
  4. Do not change the _check_auth implementation itself. Only change which endpoints route through it.

Testing & Validation Requirements

Report Requirements

Out of Scope