feat(auth): добавить заготовку Authenticator

Вводит internal/auth с TenantID, sentinel Anonymous, интерфейсом Authenticator
и NopAuthenticator (no-op, всегда возвращает Anonymous). doc.go описывает
планируемый multi-tenant поток (SQLite/HMAC/deeplink). Реальной реализации
пока нет.
This commit is contained in:
samosvalishe
2026-05-21 01:24:58 +03:00
parent 6b8b82f530
commit 65aa55b211
2 changed files with 61 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
package auth
import (
"context"
"net"
)
// TenantID identifies a tenant in a multi-tenant deployment.
// The zero value ("") is the [Anonymous] sentinel used in single-tenant mode.
type TenantID string
// Anonymous is the sentinel TenantID used when authentication is disabled
// (single-tenant / no-op mode). All call-sites pass this value until a real
// Authenticator is wired in.
const Anonymous TenantID = ""
// Authenticator authenticates an incoming connection and returns the
// TenantID it belongs to. Implementations must be safe for concurrent use.
//
// A nil error with [Anonymous] means the connection is accepted in
// non-multi-tenant mode. Any non-nil error must be treated as a rejection
// and the caller must close conn.
type Authenticator interface {
Authenticate(ctx context.Context, conn net.Conn) (TenantID, error)
}
// NopAuthenticator is a no-op Authenticator that always returns [Anonymous].
// It is the default when multi-tenant support is not configured.
type NopAuthenticator struct{}
// compile-time interface check.
var _ Authenticator = NopAuthenticator{}
// Authenticate implements [Authenticator]. It always succeeds and returns
// [Anonymous] without inspecting conn or ctx.
func (NopAuthenticator) Authenticate(_ context.Context, _ net.Conn) (TenantID, error) {
return Anonymous, nil
}
+23
View File
@@ -0,0 +1,23 @@
// Package auth defines the Authenticator interface and tenant identity types
// for multi-tenant support.
//
// # Current state
//
// Only the scaffold is present. The [NopAuthenticator] is used everywhere and
// returns [Anonymous], preserving existing single-tenant behaviour.
//
// # Planned multi-tenant flow
//
// 1. A real Authenticator (e.g. HMACAuthenticator backed by SQLite) reads a
// short token from the first bytes of conn, validates it against a per-tenant
// shared secret, and returns the matching [TenantID].
// 2. bondserver.Registry uses the TenantID as part of its de-duplication key so
// ConnIDs from different tenants never collide.
// 3. tcpfwdserver and udpserver resolve connectAddr per-tenant, allowing each
// tenant to target a different backend.
// 4. Deep-link provisioning delivers per-tenant secrets to mobile clients without
// manual configuration.
//
// None of the items above are implemented yet. See notes/AUTH_PLAN.md for the
// detailed design.
package auth