Compare commits
5 commits
heph-pwa-r
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| bc34b601be | |||
| 50a36ff93a | |||
| cf63fcb5b5 | |||
| 3abe80523a | |||
| 6576880b0e |
7 changed files with 46 additions and 4 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
# Pinned release used for the initial `cargo install` and the PWA shell.
|
# Pinned release used for the initial `cargo install` and the PWA shell.
|
||||||
# After bootstrap, hephd's own --self-update keeps the binary current; this
|
# After bootstrap, hephd's own --self-update keeps the binary current; this
|
||||||
# pin only governs the first install and the bundled PWA shell version.
|
# pin only governs the first install and the bundled PWA shell version.
|
||||||
heph_version: v1.2.0
|
heph_version: v1.2.1
|
||||||
|
|
||||||
# Anonymous public HTTPS clone — matches hephd's INSTALL_GIT_URL so the initial
|
# Anonymous public HTTPS clone — matches hephd's INSTALL_GIT_URL so the initial
|
||||||
# install and unattended self-update build from the same source (no ssh-agent).
|
# install and unattended self-update build from the same source (no ssh-agent).
|
||||||
|
|
|
||||||
|
|
@ -477,14 +477,25 @@ data:
|
||||||
invalidation_flow: !Find [authentik_flows.flow, [slug, default-provider-invalidation-flow]]
|
invalidation_flow: !Find [authentik_flows.flow, [slug, default-provider-invalidation-flow]]
|
||||||
client_type: public
|
client_type: public
|
||||||
client_id: heph
|
client_id: heph
|
||||||
# Device-code (RFC 8628) + PKCE use no redirect, but the provider
|
# CLI/TUI use the device-code grant (no redirect). The heph-pwa browser
|
||||||
# serializer requires the field — an empty list satisfies it.
|
# login uses Authorization Code + PKCE, which DOES redirect back to the
|
||||||
redirect_uris: []
|
# app's origin — register those here (Authentik also keys token-endpoint
|
||||||
|
# CORS off these origins). Trailing slash matters: the PWA's redirect_uri
|
||||||
|
# is its base dir, e.g. https://heph.ops.eblu.me/.
|
||||||
|
redirect_uris:
|
||||||
|
- matching_mode: strict
|
||||||
|
url: https://heph.ops.eblu.me/
|
||||||
|
- matching_mode: strict
|
||||||
|
url: http://localhost:8787/ # local dev (hephd --web-root)
|
||||||
signing_key: !Find [authentik_crypto.certificatekeypair, [name, authentik Self-signed Certificate]]
|
signing_key: !Find [authentik_crypto.certificatekeypair, [name, authentik Self-signed Certificate]]
|
||||||
property_mappings:
|
property_mappings:
|
||||||
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, openid]]
|
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, openid]]
|
||||||
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, email]]
|
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, email]]
|
||||||
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, profile]]
|
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, profile]]
|
||||||
|
# offline_access: heph CLI requests "openid offline_access"; without
|
||||||
|
# this mapping the refresh token is session-bound and hephd's
|
||||||
|
# refresh_token grant 400s once the session lapses (spoke sync dies).
|
||||||
|
- !Find [authentik_providers_oauth2.scopemapping, [scope_name, offline_access]]
|
||||||
sub_mode: hashed_user_id
|
sub_mode: hashed_user_id
|
||||||
include_claims_in_id_token: true
|
include_claims_in_id_token: true
|
||||||
|
|
||||||
|
|
|
||||||
1
docs/changelog.d/+heph-hub-v1.2.1.infra.md
Normal file
1
docs/changelog.d/+heph-hub-v1.2.1.infra.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Bumped the indri heph hub to v1.2.1, which adds the hub `GET /config` endpoint and ships the heph-pwa **Login with Authentik** flow (Authorization Code + PKCE). Pairs with the Authentik `heph` provider redirect URIs registered earlier.
|
||||||
1
docs/changelog.d/heph-offline-access.bugfix.md
Normal file
1
docs/changelog.d/heph-offline-access.bugfix.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Granted the `offline_access` scope on the Authentik `heph` OAuth2 provider so hephaestus spokes receive a durable 30-day refresh token. Previously the refresh token was session-bound, so spoke sync would silently fail with a `400 Bad Request` on the `refresh_token` grant once the Authentik session lapsed.
|
||||||
1
docs/changelog.d/heph-pwa-redirect-uris.infra.md
Normal file
1
docs/changelog.d/heph-pwa-redirect-uris.infra.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Registered the heph-pwa redirect URIs (`https://heph.ops.eblu.me/`, plus `http://localhost:8787/` for dev) on the Authentik `heph` OAuth2 provider, enabling the PWA's new Authorization Code + PKCE "Login with Authentik" flow (and the token-endpoint CORS it needs). Pairs with hephaestus PR #9.
|
||||||
|
|
@ -68,6 +68,17 @@ in the [[authentik]] blueprint (`argocd/manifests/authentik/configmap-blueprint.
|
||||||
- Issuer: `https://authentik.ops.eblu.me/application/o/heph/`
|
- Issuer: `https://authentik.ops.eblu.me/application/o/heph/`
|
||||||
- Audience / client id: `heph`
|
- Audience / client id: `heph`
|
||||||
- Restricted to the `admins` group (single-owner, sensitive data).
|
- Restricted to the `admins` group (single-owner, sensitive data).
|
||||||
|
- Scope mappings: `openid`, `email`, `profile`, **`offline_access`**.
|
||||||
|
|
||||||
|
> **`offline_access` is required for durable sync.** The `heph` CLI requests
|
||||||
|
> `scope = "openid offline_access"`, and a refresh token is only issued for the
|
||||||
|
> 30-day refresh-token window when the provider actually grants `offline_access`.
|
||||||
|
> Without that scope mapping the refresh token is bound to the login **session**;
|
||||||
|
> once the session lapses, hephd's `refresh_token` grant returns `400 Bad
|
||||||
|
> Request`, the bearer can't be refreshed, and spoke sync silently degrades
|
||||||
|
> (`heph sync --status` → `auth_failure: true`). `heph auth login` papers over it
|
||||||
|
> until the next session expiry. Keep `offline_access` in the provider's
|
||||||
|
> `property_mappings`.
|
||||||
|
|
||||||
Because no Authentik instance ships a device-code flow by default, the blueprint
|
Because no Authentik instance ships a device-code flow by default, the blueprint
|
||||||
also creates `default-device-code-flow` and binds it to the default brand's
|
also creates `default-device-code-flow` and binds it to the default brand's
|
||||||
|
|
|
||||||
|
|
@ -414,6 +414,23 @@ services:
|
||||||
upstream-source: https://github.com/caddyserver/caddy/releases
|
upstream-source: https://github.com/caddyserver/caddy/releases
|
||||||
notes: Built from source with Gandi DNS and Layer 4 plugins
|
notes: Built from source with Gandi DNS and Layer 4 plugins
|
||||||
|
|
||||||
|
- name: heph
|
||||||
|
type: ansible
|
||||||
|
last-reviewed: 2026-06-05
|
||||||
|
current-version: "v1.2.1"
|
||||||
|
upstream-source: https://forge.eblu.me/eblume/hephaestus/releases
|
||||||
|
notes: >-
|
||||||
|
hephaestus task/context sync hub on indri (server-mode launchagent,
|
||||||
|
ansible/roles/heph; cargo-built from the forge). SELF-UPDATING: hephd
|
||||||
|
polls the forge for newer releases every 10 min and rebuilds + restarts
|
||||||
|
itself, so the running version drifts AHEAD of the ansible heph_version
|
||||||
|
pin. current-version here is the last observed/deployed tag, not a hard
|
||||||
|
pin — verify the live version via `curl https://heph.ops.eblu.me/config`
|
||||||
|
is served (hub up) and the hub log's `current=` line. Reconciling this
|
||||||
|
self-update vs IaC-pin drift is tracked in the heph "Hephaestus" project:
|
||||||
|
"Reconcile hephd self-update with ansible-pinned version (drift on indri
|
||||||
|
hub)" (node 01KTBXWT6XTHNDH92CVJY88E5K).
|
||||||
|
|
||||||
- name: borgmatic
|
- name: borgmatic
|
||||||
type: ansible
|
type: ansible
|
||||||
last-reviewed: 2026-04-15
|
last-reviewed: 2026-04-15
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue