Skip to main content

auth.proto

Dual authentication system: Passkey/WebAuthn for interactive users, API keys for headless (CI, servers, automation).

Passkey / WebAuthn

PasskeyChallenge

message PasskeyChallenge {
  bytes challenge = 1;       // Random challenge bytes
  string rp_id = 2;          // Relying party ID (domain)
  string rp_name = 3;        // Relying party display name
  bytes user_id = 4;         // User identifier
  uint32 timeout_ms = 5;     // Challenge timeout in ms
}

PasskeyCredential

message PasskeyCredential {
  bytes credential_id = 1;       // Credential identifier
  bytes public_key = 2;          // COSE public key
  bytes attestation = 3;         // Attestation object
  bytes authenticator_data = 4;
  bytes client_data_json = 5;
  bytes signature = 6;
}

Verification Flow

message PasskeyVerifyRequest {
  PasskeyCredential credential = 1;
  bytes challenge = 2;
}

message PasskeyVerifyResponse {
  bool verified = 1;
  string subject_id = 2;
  Session session = 3;       // Issued on success
}

API Keys

API keys are the primary authentication method for the Quint API.
message ApiKey {
  string id = 1;             // Key identifier
  string key_hash = 2;       // SHA-256 hash (raw key never stored)
  string owner_id = 3;       // Owner user/service ID
  repeated string scopes = 4;// Permission scopes
  string created_at = 5;     // ISO-8601
  string expires_at = 6;     // ISO-8601 (optional)
  bool revoked = 7;
}

Create API Key

message ApiKeyCreateRequest {
  string owner_id = 1;
  repeated string scopes = 2;
  string expires_at = 3;     // Optional expiration
}

message ApiKeyCreateResponse {
  string raw_key = 1;        // Returned ONCE — never stored
  ApiKey api_key = 2;
}
The raw_key is returned only once during creation. It is hashed before storage and cannot be recovered.

Verify API Key

message ApiKeyVerifyRequest {
  string raw_key = 1;        // Key to verify
}

message ApiKeyVerifyResponse {
  bool valid = 1;
  ApiKey api_key = 2;
}
Key prefix: qk_ (Quint key)

Sessions

message Session {
  string id = 1;
  string subject_id = 2;     // User or service ID
  string auth_method = 3;    // "passkey" | "api_key"
  repeated string scopes = 4;
  string issued_at = 5;
  string expires_at = 6;     // Max 24h lifetime
  bool revoked = 7;
}

Validate Session

message SessionValidateRequest {
  string session_token = 1;
}

message SessionValidateResponse {
  bool valid = 1;
  Session session = 2;
}
Sessions have a maximum 24-hour lifetime and are issued after successful authentication (either passkey or API key).