79 lines
3.2 KiB
Markdown
79 lines
3.2 KiB
Markdown
# Public Access Contract
|
|
|
|
> **Documentation contract only.** No access-policy engine implementation.
|
|
> Architecture: [published-resource-architecture.md](../architecture/published-resource-architecture.md) · [ADR-022](../architecture/adr/ADR-022.md)
|
|
> Contract version: `public-access.v1` (additive; open strategy registry)
|
|
|
|
---
|
|
|
|
## 1. Purpose
|
|
|
|
A **Public Access Policy** describes how a Published Resource may be reached. Strategies are composable and extensible. Experience stores **policy metadata refs** for presentation/publishing; it **never owns authentication**.
|
|
|
|
| Concern | Owner |
|
|
| --- | --- |
|
|
| Authentication / SSO / session | Identity / Core ([ADR-004](../architecture/adr/ADR-004.md), [ADR-005](../architecture/adr/ADR-005.md)) |
|
|
| Payment / paid unlock | Payment ([ADR-020](../architecture/adr/ADR-020.md)) |
|
|
| Membership / tier gates | Loyalty ([ADR-011](../architecture/adr/ADR-011.md)) |
|
|
| OTP / messaging challenges | Communication ([ADR-012](../architecture/adr/ADR-012.md)) |
|
|
| Publish presentation + access policy metadata | Experience |
|
|
|
|
---
|
|
|
|
## 2. Access strategies (open registry)
|
|
|
|
Illustrative keys — **not closed**:
|
|
|
|
| Strategy key | Meaning | Auth owner |
|
|
| --- | --- | --- |
|
|
| `public` | Anyone with the URL | — |
|
|
| `private` | Not publicly listed; direct knowledge may still apply | — |
|
|
| `authenticated` | Any signed-in user | Identity |
|
|
| `tenant_members` | Members of the tenant | Core / Identity |
|
|
| `role_based` | Specific roles/permissions | Identity / Core entitlement |
|
|
| `password_protected` | Shared password challenge | Identity / Experience metadata + Identity verify |
|
|
| `otp_protected` | OTP challenge | Communication + Identity |
|
|
| `paid_access` | Unlock after payment | Payment (`publish_id`) |
|
|
| `invitation_only` | Invite token / list | Identity / Core |
|
|
| `signed_url` | Cryptographic signed link | Platform edge / Identity |
|
|
| `temporary_link` | Time-bound link | Short Link / Identity |
|
|
| `expiration` | Absolute/relative expiry on access | Policy metadata |
|
|
| `rate_limited` | Request rate caps | Edge / platform |
|
|
| `geo_restricted` | Reserved | Future |
|
|
| *future.*\* | Any registered strategy | Declared owning service |
|
|
|
|
---
|
|
|
|
## 3. Policy record (conceptual)
|
|
|
|
```
|
|
PublicAccessPolicy {
|
|
publish_id
|
|
tenant_id
|
|
strategies[] # ordered / composed
|
|
strategy_config_refs # opaque refs to owning services
|
|
expires_at?
|
|
rate_limit_ref?
|
|
}
|
|
```
|
|
|
|
Consumers evaluate access by consulting the **owning service for each strategy**, keyed by `publish_id`. Experience does not become an IdP.
|
|
|
|
---
|
|
|
|
## 4. Rules
|
|
|
|
1. Experience **MUST NOT** own authentication, password hashing as IdP, OTP providers, payment capture, or loyalty membership ledgers.
|
|
2. `paid_access` always references Payment via `publish_id`.
|
|
3. `otp_protected` always routes challenges through Communication.
|
|
4. Additive: resources with no policy default conceptually to `public` when `publish_status=published` and `visibility=public` (implementation deferred).
|
|
5. Geo restriction is **reserved** — document only.
|
|
|
|
---
|
|
|
|
## 5. Related
|
|
|
|
- [Published Action Registry](published-action-registry.md)
|
|
- [Embed Contract](embed-contract.md)
|
|
- [Published Resource Contracts](published-resource-contracts.md)
|