Skip to content

feat(auth): native email/password sign-in driven by Authentik (no redirect) + console cleanup - #218

Merged
izzywdev merged 13 commits into
masterfrom
claude/authentik-google-signin-hzs34a
Jul 12, 2026
Merged

feat(auth): native email/password sign-in driven by Authentik (no redirect) + console cleanup#218
izzywdev merged 13 commits into
masterfrom
claude/authentik-google-signin-hzs34a

Conversation

@izzywdev

Copy link
Copy Markdown
Owner

What

Product direction change per owner: the login page shows default email/password UI components as the primary sign-in — no redirect to Authentik's hosted page — while Authentik remains the sole identity authority. Google stays as a button (federated through Authentik).

Backend

  • New backend/security/src/services/authentikPassword.ts: drives Authentik's flow-executor JSON API server-side with the submitted credentials (identification + password stages; combined identification-with-password supported), then completes a standard OIDC authorization-code + PKCE exchange using the authenticated Authentik session and reuses oidcService.handleCallback for token exchange + user sync. Minimal per-login cookie jar; CSRF header from authentik_csrf; fails closed (503, "use the SSO button") on stages it can't drive (MFA/consent).
  • New POST /api/auth/oidc/password{ token, user, sessionId }, same shape as /api/auth/login; 401 on rejected credentials; 503 when OIDC is unconfigured/uninitialized or Authentik is unreachable.
  • Handoff tracing: /oidc/login now logs issuer/redirectUri/frontendBase + client-init state so the reported "blinks but nothing happens" redirect failure is diagnosable from security-service pod logs.

Frontend

  • LoginPage: credentials form is always the primary UI. With oidcConfigured, submit posts to the new Authentik-backed endpoint; without it (local dev/CI stacks), the same form falls back to local users-table auth. "Sign in with Authentik" redirect button removed; "Sign in with Google" retained.
  • Console flood fix: axios interceptors' per-request/response console.groups, the module-load config dump + extra /api/health probe, LoginPage's mount env dump, and AppContent auth-state logs are now DEV-only.

Tests

  • 8 new unit tests for the flow-executor service (happy path, combined stage, wrong password, access-denied, MFA fail-closed, unreachable, uninitialized, consent-flow detection) — all passing.
  • LoginPage suite reworked to the new contract — 8/8 passing.
  • oidc-plumbing e2e (runs against real Authentik in CI) gains two tests: password sign-in returns a platform JWT; wrong password → 401.
  • Post-prod smoke test 4 updated: native form + Google button, no Authentik redirect button, no demo creds.

Notes

  • Users must exist in Authentik to sign in via the form in prod (Authentik is the authority). The platform-DB-only synthetic smoke account continues to use the API path (/api/auth/login), which is unchanged.
  • The Authentik authentication flow must be single-factor identification+password with implicit consent on the FuzeFront provider (matches the e2e blueprint). Accounts with MFA get a clear error directing them to the SSO button.

🤖 Generated with Claude Code

https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk


Generated by Claude Code

claude added 4 commits July 10, 2026 14:48
- Replace the blanket 'tag:' sed with an awk pass that bumps ONLY the five
  core-app images this workflow builds (backend, frontend, security,
  applications, clock-app). The old sed would also stomp deliberately-pinned
  service tags and EXTERNAL images (authentik/unleash) to the app SHA.
- Capture the contents-API PUT result instead of piping to xargs: with the
  pipe, a rejected PUT (ruleset denies the actor) exited via xargs's 0 and
  the step reported success without committing — exactly what happened on
  the 965dd64 release. set -euo pipefail for the whole step.

Requires the master ruleset to list the GitHub Actions integration as a
bypass actor (being configured separately) — without it the PUT now FAILS
the release run visibly instead of pretending to deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
… (review)

gate-code-review flagged that a matched image block missing its tag: line
would leak the bump onto the next unrelated tag:. Scope the flag to the
immediately following line; verified both the normal case (exactly 5
bumps) and the omitted-tag case (4 bumps, no stray write).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
…e deploys (review)

If values-prod.yaml's layout drifts (quoted repository value, reordered
keys, renamed registry path), the scoped awk matches nothing and the step
previously took the 'nothing to bump' exit 0 — succeeding while deploying
stale tags. The awk now counts rewrites and the step hard-fails unless
exactly 5 core-app tags were rewritten. Verified: normal layout counts 5;
a quoted-repository drift counts 4 and fails.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
…direct

The login page now shows default email/password UI components as the
primary sign-in. When Authentik/OIDC is configured, submitting verifies
the credentials AGAINST AUTHENTIK server-side: a new
services/authentikPassword.ts drives Authentik's flow-executor JSON API
(identification + password stages, combined-stage supported), completes
the OIDC authorization-code + PKCE exchange with the authenticated
session, and reuses oidcService.handleCallback for user sync — Authentik
remains the sole identity authority. New POST /api/auth/oidc/password
returns the same { token, user, sessionId } shape as local login. MFA/
consent flows fail closed with a clear 503 pointing at the SSO button.

- LoginPage: credentials form always rendered (falls back to local
  users-table auth when OIDC is not configured — dev/CI stacks); 'Sign in
  with Authentik' redirect button removed; 'Sign in with Google' kept
  (federated through Authentik).
- Console flood fix: axios per-request/response console.groups, module-
  load config dump + /api/health probe, LoginPage mount env dump, and
  AppContent auth-state logs are now DEV-only.
- OIDC handoff tracing: /oidc/login logs issuer/redirect/frontend-base +
  client init state so a broken handoff is diagnosable from pod logs.
- Tests: 8 new unit tests for the flow-executor service (happy path,
  combined stage, bad creds, MFA fail-closed, unreachable, consent);
  LoginPage suite reworked (8/8); oidc-plumbing e2e gains real-Authentik
  password-login coverage (200 + JWT, wrong-password 401); post-prod
  smoke test 4 updated to the new contract.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

Comment thread backend/security/src/routes/auth.ts Dismissed
Comment thread backend/security/src/routes/auth.ts Fixed
Comment thread backend/security/src/routes/auth.ts Fixed
Comment thread backend/security/src/routes/auth.ts Fixed
Comment thread backend/security/src/routes/auth.ts Fixed
Comment thread backend/security/src/routes/auth.ts Fixed
… conformance

- The oidc-plumbing e2e stack (docker-compose.e2e.yml) serves /api/auth
  from the MONOLITH backend, not the split security service — the new
  endpoint 404'd there. Port services/authentikPassword.ts + the
  /oidc/password route to backend/src (adapted to the monolith's oidc
  service signatures: generateAuthUrl returns the URL string, PKCE
  verifier rides the in-process state map, lazy re-init mirrors
  /oidc/login).
- oidc-plumbing spec: the full redirect-flow test now enters via the
  'Sign in with Google' button (the dedicated Authentik button was
  replaced by the native form); new test 3b drives the native form
  end-to-end through /api/auth/oidc/password to the dashboard.
- Semgrep conformance on new code: constant console.log format literals
  (requestId moved into the structured payload) and a documented
  nosemgrep exemption on the platform-token mint (this service IS the
  FuzeFront token issuer, same as /login and the OIDC callback).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Fixed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/routes/auth.ts Dismissed
Comment thread backend/src/services/authentikPassword.ts Fixed
…p conformance

- /api/auth/oidc/password (both backends): fixed-window per-IP+account
  rate limit (10 attempts / 5 min per replica) before any Authentik
  contact — the endpoint is a credential-stuffing surface (CodeQL
  missing-rate-limiting).
- Log hardening: success log carries server-generated userId instead of
  the user-controlled email; flow-stage/unavailable error messages are
  newline-stripped before logging (CodeQL log-injection).
- Removed the dead 'authenticated = true' assignment in the post-loop
  guard (CodeQL useless-assignment).
- nosemgrep suppression for the platform-token mint moved to the line
  directly above jwt.sign so it actually applies (Semgrep only honors
  same-line/previous-line comments).

The remaining CodeQL 'new' alerts on this PR anchor to PRE-EXISTING
local-login code whose fingerprints shifted with the diff — triage/
dismissal tracked separately.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

…vention)

Replace the hand-rolled fixed-window limiter with the same express-rate-limit
middleware convention used by tokenAuthRateLimiter (10 failed attempts /
5 min, successful sign-ins never throttled). Also the analyzer-recognized
mitigation for CodeQL's missing-rate-limiting on the new route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

- flow-executor non-OK responses now include status + URL + a 300-char
  body snippet in the thrown error (a bare status was undebuggable from
  the compose-filtered CI logs).
- route error logs emit single-line JSON so the workflow's line-based log
  filter can't swallow the message.
- plumbing e2e assertions print the response body on mismatch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

…ecutor

The e2e run (with error bodies surfaced) named the failure exactly:
'Authentik flow executor HTTP 302' on the very first GET — Authentik
redirects once to establish the session cookie before serving the JSON
challenge, and redirect:'manual' treated that as an error. flowRequest now
follows same-flow redirects (up to 4 hops, Django 302 semantics: retried
as GET) carrying the cookie jar, and rejects non-JSON terminal responses
with a body snippet. Unit test added for the 302→challenge hop (9/9).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

  • backend/security/src/routes/auth.ts:473 — The /oidc/password handler calls authentikPasswordLogin() directly with no lazy if (!oidcService.isInitialized()) await oidcService.initialize() retry — yet the monolith copy (backend/src/routes/auth.ts) and /oidc/login both added exactly that. If the OIDC client failed to initialize at boot (Authentik not ready), authentikPasswordLogin throws AuthentikUnavailableError and this endpoint returns 503 permanently until someone hits the SSO path that re-inits — password login never self-heals.
  • backend/security/src/services/authentikPassword.ts:160 (and the monolith copy backend/src/services/authentikPassword.ts) — In flowRequest, if (!res.ok) throws AuthentikUnavailableError before response_errors is ever inspected. A flow-executor credential rejection returned as an HTTP 4xx (rather than a 200-with-errors) is surfaced to the user as 503 "service unavailable" instead of 401 invalid credentials — wrong condition ordering swallows the credential-error case.
  • backend/security/src/routes/auth.ts:452 (and monolith copy) — passwordLoginRateLimiter uses skipSuccessfulRequests: true, which only skips responses <400. The UnsupportedFlowStageError (MFA-required) and AuthentikUnavailableError paths both return 503, so they count against the 10-attempt budget: an MFA account or an Authentik outage locks legitimate users out after 10 tries even though they never submitted a bad credential.

Report-only — this check never blocks merge.

… rate limiting

All three gate-code-review findings on the password endpoint:
- security-service route now lazy re-initializes the OIDC client (parity
  with the monolith and /oidc/login) so password login self-heals after a
  boot-time Authentik outage; a failing re-init maps to 503, not 500.
- flowRequest treats a 4xx JSON response as a FLOW challenge (Authentik
  can reject credentials as HTTP 400 + response_errors) so users get 401
  invalid-credentials instead of a mislabeled 503 outage. Unit test added
  (10/10).
- passwordLoginRateLimiter counts ONLY 401s against the budget
  (requestWasSuccessful override): MFA-required accounts and Authentik
  outages no longer consume attempts and lock legitimate users out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Reviewed the diff focusing on runtime-correctness. The auth flow logic is largely sound (redundant authenticated boundary check, per-branch returns, guarded body access, intended rate-limiter semantics all check out). One concrete correctness issue stands out:

  • backend/security/src/services/authentikPassword.ts (flowRequest redirect block, ~L130) — the redirect handler treats 307/308 the same as 302/303: it forces method = 'GET' and drops payload. Per HTTP semantics, 307/308 must preserve the original method and body, so a POST that Authentik answered with a 307/308 would be silently retried as a bodyless GET and lose the credentials/stage payload. Won't fire against Authentik's normal 302 flow-executor responses, but it's a latent logic bug. Same code duplicated in backend/src/services/authentikPassword.ts.

Everything else I traced (cookie jar, MAX_STEPS exhaustion, authorize-loop code null-handling, response mapping) either behaves as intended or is guarded. I could not verify the monolith copy's OIDC-completion section (generateAuthUrl/handleCallback adaptation) because it's truncated in the diff — worth a look given the doc comment flags a signature difference there.

Report-only — this check never blocks merge.

…r (review)

Per HTTP semantics only 301/302/303 rewrite the retry as GET; a 307/308
answer to a stage POST previously lost the credentials payload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Reviewing the visible diff for runtime-correctness issues only.

  • backend/src/services/authentikPassword.ts (monolith port, truncated authorize section) — The file header states the monolith's oidcService.generateAuthUrl(state) returns a string (not { url, codeVerifier }) and handleCallback(code, state) takes 2 args, yet the security-service original (copied here) does const { url, codeVerifier } = oidcService.generateAuthUrl(state) and handleCallback(code, state, codeVerifier). If the port did not adapt those two calls, authorizeUrl/codeVerifier become undefined and the authorize fetch/token exchange break at runtime. This region is cut off in the diff and must be verified.
  • backend/security/src/routes/auth.ts:~440 (rate limiter) — passwordLoginRateLimiter keys on client IP; behind the k8s ingress every request shares the ingress IP unless app.set('trust proxy', …) is configured, so 10 failed logins from any users would lock out all users for the window. Confirm trust-proxy is set (the comment claims parity with tokenAuthRateLimiter, but that isn't in this diff).
  • backend/security/src/services/authentikPassword.ts:~230 (authorize redirect loop) — The loop caps at 5 hops (hop < 5) and the flow-executor loop at 4 (hop < 4); a real Authentik deployment that inserts extra intermediate redirects will exhaust the cap and throw AuthentikUnavailableError ("did not produce an authorization code") → spurious 503 on an otherwise-valid login.

The first item is the one to check before merging — it's a hard crash if the port wasn't adjusted, but the diff truncates exactly where it would be visible.

Report-only — this check never blocks merge.

…s (review)

- app.set('trust proxy', 1) in both backends: behind the k8s ingress all
  requests otherwise share the ingress IP, so the IP-keyed password rate
  limiter would lock out ALL users after any 10 failed attempts.
- Redirect hop caps raised to 10 in the flow executor and authorize loops
  so deployments with extra intermediate redirects don't 503 valid logins.
- (Monolith OIDC-completion adaptation the review asked to verify is
  correct: generateAuthUrl(state) string + handleCallback(code, state).)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk

Copy link
Copy Markdown
Owner Author

Re: gate-code-review's three findings — all resolved in 4b6d7c0:

  1. Monolith port adaptation (the "must verify" item): confirmed correct — backend/src/services/authentikPassword.ts:247 does const authorizeUrl = oidcService.generateAuthUrl(state) (string return; PKCE verifier rides the monolith's in-process state map) and :295 calls oidcService.handleCallback(code, returnedState || state) with two args. No destructuring of a {url, codeVerifier} shape survives in the port.
  2. Rate-limiter IP keying: real issue — neither backend set trust proxy, so behind the ingress all clients shared one IP. Both apps now app.set('trust proxy', 1).
  3. Hop caps: raised to 10 in both the flow-executor and authorize redirect loops.

Generated by Claude Code

Comment thread backend/src/index.ts Dismissed
Comment thread backend/src/index.ts Dismissed
Comment thread backend/src/index.ts Dismissed
Comment thread backend/src/index.ts Dismissed
Comment thread backend/src/index.ts Dismissed
Comment thread backend/src/index.ts Dismissed
@github-actions

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Reviewed the diff (new authentikPassword.ts, the /oidc/password route + rate limiter, and the trust proxy additions). One finding:

  • backend/security/src/services/authentikPassword.ts:158flowRequest follows every redirect (301/302/303/307/308) by resolving Location and re-fetching with the full cookie jar attached, but never verifies the redirect target is same-origin as base. The comment says "follow same-origin redirects... carrying the jar," yet there's no origin check, so any redirect Authentik (or an intermediary) emits to a different host causes the authentik_session/authentik_csrf cookies to be sent to that host. Same latent gap exists in the authorize loop (line ~272), though there the target is matched-and-broken before the cross-origin fetch. Add an origin guard before continuing the loop.

Everything else checked out: the flow-step loop is bounded by MAX_STEPS/hop caps with no false "authenticated" path, the rate limiter's limit/requestWasSuccessful matches express-rate-limit v7 and the existing tokenAuthRateLimiter convention, FRONTEND_BASE is defined in the file, redirectUri() derives from the same env/default as the OIDC client's registered URI, and no missing awaits or swallowed errors on the success path.

Report-only — this check never blocks merge.

… loops (review)

The cookie jar carries authentik_session/authentik_csrf — both redirect
loops now verify the target stays on Authentik's origin before following,
instead of presenting session cookies to whatever host a redirect names.
Unit test added (11/11).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4AUD2d6aFpPT67pnLhQGk
izzywdev added a commit that referenced this pull request Jul 12, 2026
…p ci]

Dispatchable, tightly scoped (listed rules x listed legacy files only),
dry-run by default, posts its action list to PR #218 for audit. Needed
because legacy alerts keep re-anchoring into PR diffs as "new" via
fingerprint drift, holding the CodeQL check red on unrelated work.
@github-actions

Copy link
Copy Markdown
Contributor

Code-scanning triage

DRY RUN — would dismiss 67 legacy alerts:

@github-actions

Copy link
Copy Markdown
Contributor

Code-scanning triage

Dismissed 67 legacy alerts:

@izzywdev
izzywdev marked this pull request as ready for review July 12, 2026 12:29
@github-actions
github-actions Bot enabled auto-merge (squash) July 12, 2026 12:29
@izzywdev
izzywdev merged commit 92be969 into master Jul 12, 2026
57 checks passed
@izzywdev
izzywdev deleted the claude/authentik-google-signin-hzs34a branch July 12, 2026 12:29
izzywdev added a commit that referenced this pull request Jul 12, 2026
…[skip ci]

The file-based blueprint runner fails silently (documented in the e2e
workflow), leaving prod Authentik unthemed with no enrollment flow or
Google source. This dispatchable workflow talks to prod Authentik's admin
API from a runner (the agent sandbox has no cluster egress): phase
diagnose reports brands/flows/sources/blueprint status to PR #218; phase
apply upserts the repo's blueprint files as API blueprint instances where
apply errors are actually visible.
izzywdev added a commit that referenced this pull request Jul 12, 2026
Manual GitOps bump (ruleset bypass for github-actions still pending, so
the release bump step fails loudly by design). Ships the native
Authentik-backed email/password login (#218). Scoped to the five
core-app tags.
@github-actions

Copy link
Copy Markdown
Contributor

Prod Authentik ops

BLOCKED: repo secret AUTHENTIK_PROD_TOKEN is not set. Mirror the cluster token:

kubectl -n fuzefront get secret fuzefront-secrets -o jsonpath="{.data.AUTHENTIK_BOOTSTRAP_TOKEN}" | base64 -d | gh secret set AUTHENTIK_PROD_TOKEN --repo izzywdev/FuzeFront

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

Prod Authentik ops

BLOCKED: repo secret AUTHENTIK_PROD_TOKEN is not set. Mirror the cluster token:

kubectl -n fuzefront get secret fuzefront-secrets -o jsonpath="{.data.AUTHENTIK_BOOTSTRAP_TOKEN}" | base64 -d | gh secret set AUTHENTIK_PROD_TOKEN --repo izzywdev/FuzeFront

@github-actions

Copy link
Copy Markdown
Contributor

Code-scanning triage

Dismissed 3 legacy alerts:

  • #1125 semgrep.fuze-auth-self-minted-user-token @ backend/src/routes/auth.ts
  • #1119 semgrep.fuze-auth-self-minted-user-token @ backend/security/src/routes/auth.ts
  • #1102 js/user-controlled-bypass @ frontend/src/pages/LoginPage.tsx

@github-actions

Copy link
Copy Markdown
Contributor

Prod Authentik ops

BLOCKED: repo secret AUTHENTIK_PROD_TOKEN is not set. Mirror the cluster token:

kubectl -n fuzefront get secret fuzefront-secrets -o jsonpath="{.data.AUTHENTIK_BOOTSTRAP_TOKEN}" | base64 -d | gh secret set AUTHENTIK_PROD_TOKEN --repo izzywdev/FuzeFront

1 similar comment
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Prod Authentik ops

BLOCKED: repo secret AUTHENTIK_PROD_TOKEN is not set. Mirror the cluster token:

kubectl -n fuzefront get secret fuzefront-secrets -o jsonpath="{.data.AUTHENTIK_BOOTSTRAP_TOKEN}" | base64 -d | gh secret set AUTHENTIK_PROD_TOKEN --repo izzywdev/FuzeFront

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants