Files
OpenShell/proto/credential_driver.proto
Mrunal Patel 6e90f3d5a0 feat(providers): store refresh credentials in credential drivers (#2801)
* feat(providers): store refresh credentials in credential drivers

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

* fix(providers): harden refresh credential lifecycle

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

* fix(providers): migrate legacy refresh secrets before skip

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

* refactor(providers): defer credential migration

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

* fix(providers): make refresh configuration atomic

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

---------

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2026-08-19 21:37:24 +00:00

136 lines
5.0 KiB
Protocol Buffer

// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
syntax = "proto3";
package openshell.credentials.v1;
import "datamodel.proto";
// Internal credential-driver contract used by the gateway.
//
// The gateway owns provider semantics and sandbox delivery. Credential drivers
// own backend-specific storage, deletion, authentication, and lookup for
// gateway-managed provider-secret handles. Secrets include injectable provider
// credentials and gateway-only refresh material.
service CredentialDriver {
// Report driver identity and feature support.
rpc GetCapabilities(GetCredentialDriverCapabilitiesRequest)
returns (GetCredentialDriverCapabilitiesResponse);
// Store or overwrite one gateway-managed provider secret and return an opaque handle.
rpc StoreCredential(StoreCredentialRequest) returns (StoreCredentialResponse);
// Delete one provider credential handle.
rpc DeleteCredential(DeleteCredentialRequest) returns (DeleteCredentialResponse);
// Resolve a batch of credential handles into string secret values.
rpc ResolveCredentials(ResolveCredentialsRequest)
returns (ResolveCredentialsResponse);
// Optionally list discoverable credentials. Drivers may return UNIMPLEMENTED.
rpc ListCredentials(ListCredentialsRequest) returns (ListCredentialsResponse);
}
message GetCredentialDriverCapabilitiesRequest {}
message GetCredentialDriverCapabilitiesResponse {
// Human-readable driver name.
string driver_name = 1;
// Driver implementation version string.
string driver_version = 2;
// Backend kind, such as "kubernetes-secrets" or "vault".
string backend_kind = 3;
// True when ListCredentials is supported.
bool supports_list = 4;
// True when ResolveCredentials may return expires_at_ms values.
bool supports_expires_at = 5;
}
message StoreCredentialRequest {
// Provider instance name supplied for audit and backend policy decisions.
string provider_name = 1;
// Gateway-owned logical key for this provider secret. Injectable credentials
// use their runtime environment key; refresh material uses an internal key.
string credential_key = 2;
// Secret value to store. Drivers must never log this field.
string value = 3;
// Existing handle to overwrite, if any.
openshell.datamodel.v1.CredentialHandle existing_handle = 4;
// Workspace that owns this provider. Used to ensure cross-workspace uniqueness.
string workspace = 5;
// Provider UUID. Combined with workspace to ensure globally unique backend paths.
string provider_id = 6;
// Per-write backend object identity. When empty, drivers use provider_id.
// Refreshes set this to a unique value so a staged write cannot overwrite the
// currently committed object while provider_id remains the immutable owner.
string object_id = 7;
}
message StoreCredentialResponse {
// Opaque handle for later resolution/deletion.
openshell.datamodel.v1.CredentialHandle handle = 1;
}
message DeleteCredentialRequest {
// Provider instance name supplied for audit and backend policy decisions.
string provider_name = 1;
// Gateway-owned logical key that owns the handle.
string credential_key = 2;
// Opaque handle to delete.
openshell.datamodel.v1.CredentialHandle handle = 3;
// Workspace that owns this provider. Used to ensure cross-workspace uniqueness.
string workspace = 4;
// Provider UUID. Combined with workspace to ensure globally unique backend paths.
string provider_id = 5;
}
message DeleteCredentialResponse {}
message ResolveCredentialsRequest {
repeated ResolveCredentialRequest credentials = 1;
}
message ResolveCredentialRequest {
// Gateway-chosen opaque ID used to correlate batch responses.
string request_id = 1;
// Provider instance name supplied for audit and backend policy decisions.
string provider_name = 2;
// Gateway-owned logical key for the value being resolved.
string credential_key = 3;
// Opaque handle to resolve.
openshell.datamodel.v1.CredentialHandle handle = 4;
// Workspace that owns this provider. Used to ensure cross-workspace uniqueness.
string workspace = 5;
// Provider UUID. Combined with workspace to ensure globally unique backend paths.
string provider_id = 6;
}
message ResolveCredentialsResponse {
repeated ResolvedCredential credentials = 1;
}
message ResolvedCredential {
// Echoes ResolveCredentialRequest.request_id.
string request_id = 1;
// Secret string value. Drivers must never log this field.
string value = 2;
// Expiration timestamp in milliseconds since Unix epoch, or zero when absent.
int64 expires_at_ms = 3;
}
message ListCredentialsRequest {}
message ListCredentialsResponse {
repeated ListedCredential credentials = 1;
}
message ListedCredential {
// Opaque handle identifier or driver-owned display name.
string handle = 1;
// Available credential keys under the backend object.
repeated string keys = 2;
// Driver-owned non-secret metadata.
map<string, string> metadata = 3;
}