first commit
This commit is contained in:
@@ -0,0 +1,117 @@
|
|||||||
|
# Authentik OIDC — React + Node
|
||||||
|
|
||||||
|
Demo stack showing the standard OIDC split:
|
||||||
|
|
||||||
|
| Layer | Token | Purpose |
|
||||||
|
|-------|-------|---------|
|
||||||
|
| **React frontend** | ID Token | Login, user profile (`sub`, `email`, `name`) |
|
||||||
|
| **Node API** | Access Token | `Authorization: Bearer` on protected routes |
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐ OIDC (PKCE) ┌──────────────┐
|
||||||
|
│ React │ ◄──────────────────► │ Authentik │
|
||||||
|
│ (Vite) │ ID + Access tokens │ (Provider) │
|
||||||
|
└──────┬──────┘ └──────────────┘
|
||||||
|
│ Bearer access_token
|
||||||
|
▼
|
||||||
|
┌─────────────┐ JWKS verify JWT ┌──────────────┐
|
||||||
|
│ Express │ ◄────────────────── │ Authentik │
|
||||||
|
│ API :3001 │ │ JWKS │
|
||||||
|
└─────────────┘ └──────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- Running [Authentik](https://goauthentik.io/) instance
|
||||||
|
|
||||||
|
## 1. Configure Authentik
|
||||||
|
|
||||||
|
1. In Authentik Admin → **Applications** → **Providers** → **Create** → **OAuth2/OpenID Provider**.
|
||||||
|
2. Set:
|
||||||
|
- **Client type**: Public (for SPA + PKCE)
|
||||||
|
- **Redirect URIs**: `http://localhost:5173`
|
||||||
|
- **Signing Key**: your instance default
|
||||||
|
- **Scopes**: `openid`, `profile`, `email` (defaults are fine)
|
||||||
|
3. Create an **Application** and link it to this provider.
|
||||||
|
4. Note:
|
||||||
|
- **Client ID** (slug or UUID from provider)
|
||||||
|
- **Issuer / OpenID Configuration URL** — typically
|
||||||
|
`https://<your-authentik>/application/o/<slug>/`
|
||||||
|
|
||||||
|
Copy issuer and client ID into env files (see below).
|
||||||
|
|
||||||
|
## 2. Environment files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp frontend/.env.example frontend/.env
|
||||||
|
cp backend/.env.example backend/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit both files with your Authentik issuer URL and client ID.
|
||||||
|
`OIDC_AUDIENCE` on the backend should match the access token `aud` claim (usually the same client ID for Authentik).
|
||||||
|
|
||||||
|
## 3. Install and run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run install:all
|
||||||
|
|
||||||
|
# Terminal 1 — API
|
||||||
|
npm run dev:backend
|
||||||
|
|
||||||
|
# Terminal 2 — frontend
|
||||||
|
npm run dev:frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
Open http://localhost:5173 → **Sign in** → after login you’ll see ID token claims and can call **GET /api/me** with the access token.
|
||||||
|
|
||||||
|
## Project layout
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/ React + react-oidc-context (ID token for UI)
|
||||||
|
backend/ Express + jose JWKS validation (access token)
|
||||||
|
deploy/ Docker Compose (Authentik + app) for Ubuntu server
|
||||||
|
```
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
**Frontend** (`react-oidc-context` + PKCE):
|
||||||
|
|
||||||
|
- Redirects to Authentik for login
|
||||||
|
- Stores session in `localStorage`
|
||||||
|
- Reads **ID token** claims via `auth.user.profile`
|
||||||
|
- Sends **access token** as `Authorization: Bearer <token>` to the API
|
||||||
|
|
||||||
|
**Backend** (`jose`):
|
||||||
|
|
||||||
|
- Fetches JWKS from `{OIDC_ISSUER}.well-known/jwks`
|
||||||
|
- Verifies JWT signature, `iss`, and optional `aud`
|
||||||
|
- Exposes user info from access token claims on `/api/me`
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
| Symptom | Check |
|
||||||
|
|---------|--------|
|
||||||
|
| Redirect URI mismatch | Authentik redirect URI must exactly match `http://localhost:5173` |
|
||||||
|
| Invalid issuer | `VITE_OIDC_AUTHORITY` and `OIDC_ISSUER` must be identical (trailing slash) |
|
||||||
|
| 401 on API | `OIDC_AUDIENCE` must match token `aud`; token must be sent as Bearer |
|
||||||
|
| CORS errors | `CORS_ORIGIN` must match frontend URL |
|
||||||
|
|
||||||
|
## Deploy on Ubuntu Server (Docker)
|
||||||
|
|
||||||
|
See **[deploy/README.md](deploy/README.md)** for Dockerfiles, `docker compose`, and Authentik on Ubuntu (e.g. Azure VM).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
sudo ./install-ubuntu.sh
|
||||||
|
cp .env.example .env # edit SERVER_HOST, URLs
|
||||||
|
./start-authentik.sh
|
||||||
|
docker compose --env-file .env up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production notes
|
||||||
|
|
||||||
|
- Use HTTPS redirect URIs
|
||||||
|
- Prefer httpOnly cookies or BFF pattern if you need to hide tokens from the browser
|
||||||
|
- Rotate signing keys in Authentik as documented
|
||||||
|
- Restrict CORS to your real frontend origin
|
||||||
Reference in New Issue
Block a user