@o3co/create-auth-provider 0.17.0 → 0.18.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -198
- package/main.js +4 -0
- package/package.json +8 -30
- package/README.ja.md +0 -200
- package/dist/cli.d.mts +0 -3
- package/dist/cli.d.mts.map +0 -1
- package/dist/cli.mjs +0 -18
- package/dist/index.d.mts +0 -48
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -325
- package/dist/internal/template-filter.d.mts +0 -14
- package/dist/internal/template-filter.d.mts.map +0 -1
- package/dist/internal/template-filter.mjs +0 -42
- package/templates/standalone/.dockerignore +0 -23
- package/templates/standalone/.env.example +0 -152
- package/templates/standalone/Dockerfile +0 -125
- package/templates/standalone/Makefile +0 -12
- package/templates/standalone/README.ja.md +0 -912
- package/templates/standalone/README.md +0 -1536
- package/templates/standalone/config/application.conf +0 -351
- package/templates/standalone/config/clients.yaml +0 -4
- package/templates/standalone/config/clients.yaml.example +0 -124
- package/templates/standalone/config/development.conf +0 -17
- package/templates/standalone/config/mailpit.conf +0 -13
- package/templates/standalone/config/production.conf +0 -15
- package/templates/standalone/config/reference.conf +0 -427
- package/templates/standalone/docker-compose.mailpit.yml +0 -39
- package/templates/standalone/docker-compose.production.yml +0 -229
- package/templates/standalone/docker-compose.test.yml +0 -16
- package/templates/standalone/docker-compose.yml +0 -67
- package/templates/standalone/gitignore +0 -23
- package/templates/standalone/package.json +0 -56
- package/templates/standalone/src/__tests__/adapters.test.mts +0 -425
- package/templates/standalone/src/__tests__/admission-lifecycle.test.mts +0 -87
- package/templates/standalone/src/__tests__/all-modules-composition.fixture.mts +0 -1188
- package/templates/standalone/src/__tests__/all-modules-composition.multi.test.mts +0 -285
- package/templates/standalone/src/__tests__/all-modules-composition.test.mts +0 -1154
- package/templates/standalone/src/__tests__/audit-sink.test.mts +0 -355
- package/templates/standalone/src/__tests__/backchannel-peer.fixture.mts +0 -64
- package/templates/standalone/src/__tests__/config-notices.test.mts +0 -157
- package/templates/standalone/src/__tests__/configPath.test.mts +0 -69
- package/templates/standalone/src/__tests__/configured-mfa-mode.fixture.mts +0 -48
- package/templates/standalone/src/__tests__/core-federations.test.mts +0 -252
- package/templates/standalone/src/__tests__/core-sections.test.mts +0 -192
- package/templates/standalone/src/__tests__/device-code-store-client-module.test.mts +0 -95
- package/templates/standalone/src/__tests__/documented-env-overrides.test.mts +0 -1291
- package/templates/standalone/src/__tests__/federation-grants-composition.test.mts +0 -787
- package/templates/standalone/src/__tests__/federation-grants-survive-logout.test.mts +0 -464
- package/templates/standalone/src/__tests__/federation-token-refresh-outage.test.mts +0 -141
- package/templates/standalone/src/__tests__/federation-types.test.mts +0 -239
- package/templates/standalone/src/__tests__/frontchannel-logout-csp.test.mts +0 -168
- package/templates/standalone/src/__tests__/google-session.fixture.mts +0 -318
- package/templates/standalone/src/__tests__/host-routes.test.mts +0 -134
- package/templates/standalone/src/__tests__/library-reference-resolution.smoke.test.mts +0 -29
- package/templates/standalone/src/__tests__/library-references.fixture.mts +0 -188
- package/templates/standalone/src/__tests__/lifecycle-pending-close.test.mts +0 -217
- package/templates/standalone/src/__tests__/listen.test.mts +0 -121
- package/templates/standalone/src/__tests__/logger-projection.test.mts +0 -77
- package/templates/standalone/src/__tests__/logout-session-cookie.test.mts +0 -113
- package/templates/standalone/src/__tests__/mail-sender.test.mts +0 -134
- package/templates/standalone/src/__tests__/mailpit-compose.test.mts +0 -393
- package/templates/standalone/src/__tests__/metrics.test.mts +0 -253
- package/templates/standalone/src/__tests__/mfa-routes-budget.test.mts +0 -122
- package/templates/standalone/src/__tests__/mfa-switch.redis.test.mts +0 -127
- package/templates/standalone/src/__tests__/mfa-switch.test.mts +0 -883
- package/templates/standalone/src/__tests__/own-modules.test.mts +0 -1480
- package/templates/standalone/src/__tests__/post-logout-redirect.test.mts +0 -183
- package/templates/standalone/src/__tests__/redis-assume-noeviction.test.mts +0 -283
- package/templates/standalone/src/__tests__/redis-connection-error-log.test.mts +0 -135
- package/templates/standalone/src/__tests__/redis-rate-limiter-config-survives.test.mts +0 -214
- package/templates/standalone/src/__tests__/redis-stand-in.fixture.mts +0 -98
- package/templates/standalone/src/__tests__/refresh-token-family-client-module.test.mts +0 -249
- package/templates/standalone/src/__tests__/replica-safety.test.mts +0 -657
- package/templates/standalone/src/__tests__/repositories-logger.test.mts +0 -119
- package/templates/standalone/src/__tests__/router-error-answers.test.mts +0 -146
- package/templates/standalone/src/__tests__/scaffold-assets.test.mts +0 -610
- package/templates/standalone/src/__tests__/sections.test.mts +0 -516
- package/templates/standalone/src/__tests__/session-lifecycle.test.mts +0 -213
- package/templates/standalone/src/__tests__/session-logout-invalidates-token.test.mts +0 -305
- package/templates/standalone/src/__tests__/session-logout-lifecycle.test.mts +0 -130
- package/templates/standalone/src/__tests__/session-requirements.test.mts +0 -382
- package/templates/standalone/src/__tests__/shipped-config-notices.test.mts +0 -274
- package/templates/standalone/src/__tests__/shutdown.test.mts +0 -622
- package/templates/standalone/src/__tests__/smoke.test.mts +0 -642
- package/templates/standalone/src/__tests__/startup-log-lines.test.mts +0 -164
- package/templates/standalone/src/__tests__/store-credential.test.mts +0 -314
- package/templates/standalone/src/__tests__/supertest-loopback.test.mts +0 -296
- package/templates/standalone/src/__tests__/three-tier-resolution.test.mts +0 -265
- package/templates/standalone/src/__tests__/two-phase-config.test.mts +0 -605
- package/templates/standalone/src/__tests__/upstream-amr.acceptance.test.mts +0 -385
- package/templates/standalone/src/adapters.mts +0 -162
- package/templates/standalone/src/app.mts +0 -127
- package/templates/standalone/src/bootRefusal.mts +0 -117
- package/templates/standalone/src/buildModules.mts +0 -358
- package/templates/standalone/src/configPath.mts +0 -487
- package/templates/standalone/src/listen.mts +0 -60
- package/templates/standalone/src/logger.mts +0 -80
- package/templates/standalone/src/metrics.mts +0 -167
- package/templates/standalone/src/mfaSwitch.mts +0 -284
- package/templates/standalone/src/modules.mts +0 -705
- package/templates/standalone/src/rootRenames.mts +0 -95
- package/templates/standalone/src/routes.mts +0 -89
- package/templates/standalone/src/sections.mts +0 -378
- package/templates/standalone/src/securityHeaders.mts +0 -36
- package/templates/standalone/src/shutdown.mts +0 -213
- package/templates/standalone/tests/Makefile +0 -5
- package/templates/standalone/tests/index.test.js +0 -283
- package/templates/standalone/tests/package-lock.json +0 -1617
- package/templates/standalone/tests/package.json +0 -16
- package/templates/standalone/tests/vitest.config.mjs +0 -26
- package/templates/standalone/tsconfig.json +0 -31
- package/templates/standalone/vitest.config.mts +0 -31
- package/templates/standalone/vitest.supertest-loopback.mts +0 -278
- package/templates/versions.json +0 -20
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
# Production compose example (#293 item 16).
|
|
2
|
-
#
|
|
3
|
-
# `docker-compose.yml` is a DEVELOPMENT file: it builds the `develop` target
|
|
4
|
-
# and bind-mounts ./src and ./config into the container, so copy-paste
|
|
5
|
-
# deploying it ships a hot-reload server running your working tree. This file
|
|
6
|
-
# is the deployable shape: the `runtime` target (compiled JS only, tini,
|
|
7
|
-
# healthcheck), no source mounts, restart policies, and a Redis that is
|
|
8
|
-
# reachable from the app network only and persists to a volume.
|
|
9
|
-
#
|
|
10
|
-
# openssl genpkey -algorithm ed25519 -out jwt-private.pem
|
|
11
|
-
# openssl pkey -in jwt-private.pem -pubout -out jwt-public.pem
|
|
12
|
-
# chmod 600 jwt-private.pem
|
|
13
|
-
# docker compose -f docker-compose.production.yml up -d --build
|
|
14
|
-
#
|
|
15
|
-
# The pem pair is required: EdDSA is the default and there is no key-material
|
|
16
|
-
# default, so a deployment that generates none fails at boot naming the keys to
|
|
17
|
-
# set. It reaches the container as a compose secret rather than through
|
|
18
|
-
# `config/`, which the image COPYs — see the `secrets:` block below. So does
|
|
19
|
-
# the client registry, `config/clients.yaml` (#705): it is per-deployment, so
|
|
20
|
-
# `.gitignore` keeps it out of git and `.dockerignore` out of the image, and
|
|
21
|
-
# the image carries no registry of its own. Create it from
|
|
22
|
-
# `config/clients.yaml.example` before the first `up`.
|
|
23
|
-
#
|
|
24
|
-
# What this file deliberately does NOT do:
|
|
25
|
-
#
|
|
26
|
-
# - **TLS.** Terminate it in front (reverse proxy / load balancer). The
|
|
27
|
-
# HTTP_TRUST_PROXY entry below then needs that hop's address so `req.ip` —
|
|
28
|
-
# and every IP-keyed rate limit — means the client, not the proxy; compose
|
|
29
|
-
# refuses to start until you supply it. See README "Multi-replica
|
|
30
|
-
# deployments".
|
|
31
|
-
# - **Scale out.** This is one replica (CORE_DEPLOYMENT_MODE=single). Before
|
|
32
|
-
# `--scale app=N`, set CORE_DEPLOYMENT_MODE=multi and read that same README
|
|
33
|
-
# section — boot will then refuse any in-memory store that must be shared.
|
|
34
|
-
# - **Invent secrets.** SESSION_STORE_SECRET comes from `.env`, which is required
|
|
35
|
-
# here — chmod 600 it, keep it out of git (`git local-files` or your secret
|
|
36
|
-
# manager of choice), and never bake it into the image. The client
|
|
37
|
-
# registry's secrets are yours to write too; give them as bcrypt hashes.
|
|
38
|
-
|
|
39
|
-
services:
|
|
40
|
-
app:
|
|
41
|
-
build:
|
|
42
|
-
context: .
|
|
43
|
-
target: runtime
|
|
44
|
-
restart: unless-stopped
|
|
45
|
-
ports:
|
|
46
|
-
# Loopback-bound on purpose (#407). This file assumes TLS is terminated
|
|
47
|
-
# in front, and the README says to keep `/metrics` off the public
|
|
48
|
-
# listener — a bare "3000:3000" publishes on every interface and
|
|
49
|
-
# contradicts both. A reverse proxy on the same host reaches it here.
|
|
50
|
-
#
|
|
51
|
-
# If your load balancer is on another host, publish it instead
|
|
52
|
-
# (`- "3000:3000"`) and put the access control somewhere real: a
|
|
53
|
-
# security group, a firewall rule, or the proxy's own network. Do not
|
|
54
|
-
# widen this line and call it done.
|
|
55
|
-
- "127.0.0.1:3000:3000"
|
|
56
|
-
# Compose's default grace is ten seconds — the HTTP drain
|
|
57
|
-
# budget alone. With federation grants on, `src/app.mts` gives cleanup 45
|
|
58
|
-
# more for the drain of a rotated upstream credential's write, and SIGKILL
|
|
59
|
-
# has to arrive after that: drain (10) + cleanup (45) + an exit margin.
|
|
60
|
-
# The cleanup allowance grows by itself with `federation-grants.upstreamHardTimeoutMs`,
|
|
61
|
-
# `persistRetryBudgetMs` and `lockWaitMs`; raise this to match when you raise them.
|
|
62
|
-
stop_grace_period: 60s
|
|
63
|
-
depends_on:
|
|
64
|
-
redis:
|
|
65
|
-
condition: service_healthy
|
|
66
|
-
env_file:
|
|
67
|
-
# Required, unlike the dev file: a production boot without
|
|
68
|
-
# SESSION_STORE_SECRET (or with the sample one) must fail loudly here, not
|
|
69
|
-
# serve quietly with a guessable secret.
|
|
70
|
-
- path: .env
|
|
71
|
-
required: true
|
|
72
|
-
secrets:
|
|
73
|
-
# The signing keys. EdDSA is the default algorithm and there is no key
|
|
74
|
-
# material default, so the process needs the pem pair at boot — and the
|
|
75
|
-
# `runtime` image deliberately does not contain it: `Dockerfile` COPYs
|
|
76
|
-
# `config/`, so a key parked there is baked into a layer that travels
|
|
77
|
-
# with every image push. Compose secrets mount read-only under
|
|
78
|
-
# /run/secrets and are the reason the env below overrides the
|
|
79
|
-
# `./jwt-*.pem` paths in `.env.example`.
|
|
80
|
-
#
|
|
81
|
-
# Generate them next to this file before the first `up`:
|
|
82
|
-
# openssl genpkey -algorithm ed25519 -out jwt-private.pem
|
|
83
|
-
# openssl pkey -in jwt-private.pem -pubout -out jwt-public.pem
|
|
84
|
-
# chmod 600 jwt-private.pem
|
|
85
|
-
- jwt_private_key
|
|
86
|
-
- jwt_public_key
|
|
87
|
-
# The client registry (#705), for the same reason: `config/clients.yaml`
|
|
88
|
-
# is per-deployment and may hold client secrets, so it is kept out of the
|
|
89
|
-
# image and mounted here. REPOSITORIES_CLIENT_YAML_PATH below points the process at it.
|
|
90
|
-
- client_registry
|
|
91
|
-
environment:
|
|
92
|
-
NODE_ENV: production
|
|
93
|
-
# One replica. Under `single` the replica-safety guard is SILENT by
|
|
94
|
-
# design — you have told it there are no peers — so it will not tell you
|
|
95
|
-
# that a store below is on memory while its sibling is on Redis. That is
|
|
96
|
-
# why the adapter block further down states every one of them explicitly
|
|
97
|
-
# instead of leaving them to inherit. Before `--scale app=N`, set `multi`
|
|
98
|
-
# and read the README's "Multi-replica deployments".
|
|
99
|
-
CORE_DEPLOYMENT_MODE: single
|
|
100
|
-
# Behind the TLS terminator this file assumes, `req.ip` is the proxy's
|
|
101
|
-
# address and `req.protocol` reads `http` until this names the hop. The
|
|
102
|
-
# README calls it required for exactly that reason, and the cost of
|
|
103
|
-
# leaving it unset is three failures at once: the Secure cookie pinned
|
|
104
|
-
# below is never set, the CSRF origin check 403s every browser POST
|
|
105
|
-
# (the browser sends `Origin: https://…`, the process believes it is
|
|
106
|
-
# serving http), and every IP-keyed rate limit — the OAuth endpoint
|
|
107
|
-
# limiters and the /session/login brute-force guard — shares ONE bucket
|
|
108
|
-
# across all users.
|
|
109
|
-
#
|
|
110
|
-
# It cannot be guessed and it is not defaulted: only you know what sits
|
|
111
|
-
# in front, and a default here would silently trust a hop you never
|
|
112
|
-
# chose. Put your edge's address or CIDR range in `.env` — `10.0.0.0/8`,
|
|
113
|
-
# or `loopback` for a sidecar on this host. Prefer that over `true`,
|
|
114
|
-
# which believes a forwarded client address from anyone able to reach
|
|
115
|
-
# this process. The `:?` form makes compose refuse to start until it is
|
|
116
|
-
# set, rather than starting wrong.
|
|
117
|
-
HTTP_TRUST_PROXY: ${HTTP_TRUST_PROXY:?set to your TLS terminator's address or CIDR range (e.g. 10.0.0.0/8, or `loopback` for a same-host sidecar) — never `true` behind an open network}
|
|
118
|
-
# Point the process at the mounted secrets rather than the working-copy
|
|
119
|
-
# paths `.env` carries for local runs.
|
|
120
|
-
KEY_STORE_LOCAL_PRIVATE_KEY_PATH: /run/secrets/jwt_private_key
|
|
121
|
-
KEY_STORE_LOCAL_PUBLIC_KEY_PATH: /run/secrets/jwt_public_key
|
|
122
|
-
REPOSITORIES_CLIENT_YAML_PATH: /run/secrets/client_registry
|
|
123
|
-
# `environment` wins over `env_file`, which is the point here:
|
|
124
|
-
# `.env.example` ships SESSION_STORE_SECURE=false / SESSION_STORE_NAME=auth.sid so a
|
|
125
|
-
# plain-HTTP local run works, and this file requires that same `.env`.
|
|
126
|
-
# Behind the TLS this compose assumes, a non-Secure session cookie is the
|
|
127
|
-
# session handed to anyone who can read one plaintext hop. The default
|
|
128
|
-
# `__Host-` cookie name is restored with it — the prefix browsers only
|
|
129
|
-
# honour on a Secure cookie.
|
|
130
|
-
SESSION_STORE_SECURE: "true"
|
|
131
|
-
SESSION_STORE_NAME: __Host-auth.session
|
|
132
|
-
# Every Redis-backed store shares the compose-network Redis below.
|
|
133
|
-
#
|
|
134
|
-
# These are stated in full rather than inherited from
|
|
135
|
-
# `config/reference.conf`, so that the deployable file names its own
|
|
136
|
-
# topology: an operator reading only this one can see which stores
|
|
137
|
-
# survive a restart. `ADAPTERS_CODE_REPOSITORY` and
|
|
138
|
-
# `ADAPTERS_ACCESS_TOKEN_DENYLIST` already ship as `redis` in that file
|
|
139
|
-
# and are left there on purpose — restating a value that agrees is
|
|
140
|
-
# a second place to forget to change.
|
|
141
|
-
REDIS_CLIENTS_URL: redis://redis:6379
|
|
142
|
-
SESSION_STORE_STORAGE_TYPE: redis
|
|
143
|
-
SESSION_STORE_STORAGE_REDIS_URL: redis://redis:6379
|
|
144
|
-
# The UserSession stores: the provider's own record of who is signed in,
|
|
145
|
-
# the subject index and revocation boundaries beside it, and the session
|
|
146
|
-
# lifecycle records. They MUST be on Redis whenever the express-session
|
|
147
|
-
# store above is, and this line is the fix for what happens when they
|
|
148
|
-
# are not.
|
|
149
|
-
#
|
|
150
|
-
# express-session on Redis survives a restart; a memory UserSession store
|
|
151
|
-
# does not. So every browser comes back holding a session cookie whose
|
|
152
|
-
# express-session record still says `isAuthenticated: true`, while the
|
|
153
|
-
# `UserSession` that record points at is gone — /authorize sees an
|
|
154
|
-
# authenticated session, finds no user session behind it, and sends the
|
|
155
|
-
# browser to log in again, where the still-valid cookie puts it straight
|
|
156
|
-
# back. A login loop that clears only when the user deletes the cookie.
|
|
157
|
-
# `CORE_DEPLOYMENT_MODE: single` says nothing about it: the replica guard
|
|
158
|
-
# answers "can these stores be shared", not "do these two stores have the
|
|
159
|
-
# same lifetime".
|
|
160
|
-
ADAPTERS_USER_SESSION_STORES: redis
|
|
161
|
-
# The memory rate limiter is per-process and evadable under bucket
|
|
162
|
-
# exhaustion (see README) — production points it at Redis.
|
|
163
|
-
ADAPTERS_RATE_LIMITER: redis
|
|
164
|
-
# The counter behind the login's own attempt limit: on Redis, a restart
|
|
165
|
-
# does not reset it. Redis must keep `maxmemory-policy noeviction`.
|
|
166
|
-
ADAPTERS_ATTEMPT_COUNTER: redis
|
|
167
|
-
# The federation token store is deliberately left at its `memory`
|
|
168
|
-
# default, and that is coherent here rather than an oversight: this
|
|
169
|
-
# template ships every federation disabled, so nothing writes to the
|
|
170
|
-
# store, and switching it on would need a 32-byte AES key
|
|
171
|
-
# (REDIS_FEDERATION_TOKEN_STORE_ENCRYPTION_KEY) that this file must not
|
|
172
|
-
# invent — the records are long-lived upstream refresh tokens. Enabling
|
|
173
|
-
# a federation means setting BOTH, together:
|
|
174
|
-
# ADAPTERS_FEDERATION_TOKEN_STORE: redis
|
|
175
|
-
# REDIS_FEDERATION_TOKEN_STORE_ENCRYPTION_KEY: <openssl rand -base64 32, from .env>
|
|
176
|
-
#
|
|
177
|
-
# MFA is on by default (MFA_MODE, `required`): every password login
|
|
178
|
-
# needs a second factor. Its two stores are left at their `memory`
|
|
179
|
-
# default, which the template refuses in production before boot; that
|
|
180
|
-
# refusal names everything MFA needs and the opt-out, so it is the first
|
|
181
|
-
# thing a deployment that has decided nothing about MFA meets. Decide in
|
|
182
|
-
# `.env`: either turn it on with all of
|
|
183
|
-
# ADAPTERS_MFA_FACTOR_STORE=redis (or `store`, the factors in your Store)
|
|
184
|
-
# ADAPTERS_MFA_TRANSACTION_STORE=redis
|
|
185
|
-
# MFA_ENCRYPTION_KEY=<openssl rand -base64 32>
|
|
186
|
-
# STANDARD_SMTP_MAIL_SENDER_HOST=... and STANDARD_SMTP_MAIL_SENDER_FROM=...
|
|
187
|
-
# MFA_PAGE_URL=<your MFA page, /mfa by default>
|
|
188
|
-
# or keep the provider without MFA:
|
|
189
|
-
# MFA_MODE=off
|
|
190
|
-
# The Redis below persists (appendonly), as the MFA stores need: a lost
|
|
191
|
-
# factor lets whoever holds the password bind one of their own.
|
|
192
|
-
|
|
193
|
-
redis:
|
|
194
|
-
# Tag-pinned, not digest-pinned. The Dockerfile argues for digests (#289)
|
|
195
|
-
# and that argument holds here too — a tag is mutable, so two `up`s a month
|
|
196
|
-
# apart can run different Redis builds. Pin the digest for a production
|
|
197
|
-
# deployment you need to reproduce:
|
|
198
|
-
# image: redis:7.2-alpine@sha256:<digest>
|
|
199
|
-
# Left as a tag in the template because a digest goes stale the week it is
|
|
200
|
-
# written and a scaffold that ships a stale one teaches nothing (#407).
|
|
201
|
-
image: redis:7.2-alpine
|
|
202
|
-
restart: unless-stopped
|
|
203
|
-
# No `ports:`, deliberately — the app reaches Redis over the compose
|
|
204
|
-
# network, and nothing else should. The dev file publishes 6379 to
|
|
205
|
-
# loopback for redis-cli convenience; a published production Redis with
|
|
206
|
-
# no AUTH is an incident.
|
|
207
|
-
command: ["redis-server", "--appendonly", "yes"]
|
|
208
|
-
volumes:
|
|
209
|
-
- redis-data:/data
|
|
210
|
-
healthcheck:
|
|
211
|
-
test: ["CMD", "redis-cli", "ping"]
|
|
212
|
-
interval: 5s
|
|
213
|
-
timeout: 3s
|
|
214
|
-
retries: 5
|
|
215
|
-
|
|
216
|
-
volumes:
|
|
217
|
-
redis-data:
|
|
218
|
-
|
|
219
|
-
secrets:
|
|
220
|
-
# File-backed, so the pem pair and the client registry stay on the host and
|
|
221
|
-
# reach the container read-only at /run/secrets. Keep them out of git
|
|
222
|
-
# alongside `.env`; a key committed or COPYed into the image is a key you
|
|
223
|
-
# have to rotate.
|
|
224
|
-
jwt_private_key:
|
|
225
|
-
file: ./jwt-private.pem
|
|
226
|
-
jwt_public_key:
|
|
227
|
-
file: ./jwt-public.pem
|
|
228
|
-
client_registry:
|
|
229
|
-
file: ./config/clients.yaml
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
services:
|
|
2
|
-
app:
|
|
3
|
-
build:
|
|
4
|
-
context: .
|
|
5
|
-
target: develop
|
|
6
|
-
ports:
|
|
7
|
-
- "3000:3000"
|
|
8
|
-
volumes:
|
|
9
|
-
- ./src:/home/node/src
|
|
10
|
-
- ./config:/home/node/config
|
|
11
|
-
# Compose's default grace is ten seconds — the HTTP drain
|
|
12
|
-
# budget alone. With federation grants on, `src/app.mts` gives cleanup 45
|
|
13
|
-
# more for the drain of a rotated upstream credential's write, and SIGKILL
|
|
14
|
-
# has to arrive after that: drain (10) + cleanup (45) + an exit margin.
|
|
15
|
-
# The cleanup allowance grows by itself with `federation-grants.upstreamHardTimeoutMs`,
|
|
16
|
-
# `persistRetryBudgetMs` and `lockWaitMs`; raise this to match when you raise them.
|
|
17
|
-
stop_grace_period: 60s
|
|
18
|
-
depends_on:
|
|
19
|
-
redis:
|
|
20
|
-
condition: service_healthy
|
|
21
|
-
env_file:
|
|
22
|
-
- path: .env
|
|
23
|
-
required: false
|
|
24
|
-
environment:
|
|
25
|
-
# The same coherence the production file states, for the same reason,
|
|
26
|
-
# and it matters MORE here. `config/application.conf` already puts
|
|
27
|
-
# express-session, the authorization codes and the access-token denylist
|
|
28
|
-
# on the Redis this compose runs; only the UserSession stores were left
|
|
29
|
-
# on their `memory` default. That combination survives a restart on one
|
|
30
|
-
# side and not the other, so every browser comes back holding an
|
|
31
|
-
# express-session that still says `isAuthenticated` with no `UserSession`
|
|
32
|
-
# behind it and /authorize loops.
|
|
33
|
-
#
|
|
34
|
-
# A dev container restarts on every save (`target: develop` is hot
|
|
35
|
-
# reload), so the developer meets that loop constantly — and meets it
|
|
36
|
-
# while changing something else, which is the worst possible time to
|
|
37
|
-
# debug it. Redis is already running and already required by three other
|
|
38
|
-
# stores, so this costs nothing: the shared ioredis socket is open
|
|
39
|
-
# either way.
|
|
40
|
-
ADAPTERS_USER_SESSION_STORES: redis
|
|
41
|
-
# MFA is on by default (MFA_MODE). Its two stores ship in memory, which
|
|
42
|
-
# this run would empty on every save: every enrolled factor gone while
|
|
43
|
-
# the sessions above survive, so each password login after a save binds
|
|
44
|
-
# a factor anew. On the Redis above they last as the sessions do. These
|
|
45
|
-
# lines, like ADAPTERS_USER_SESSION_STORES above, override `.env`:
|
|
46
|
-
# compose's `environment:` wins over `env_file`. The key ring is
|
|
47
|
-
# config/development.conf's sample key and the mail sender logs each
|
|
48
|
-
# code; MFA_MODE=off in .env runs without MFA.
|
|
49
|
-
ADAPTERS_MFA_FACTOR_STORE: redis
|
|
50
|
-
ADAPTERS_MFA_TRANSACTION_STORE: redis
|
|
51
|
-
|
|
52
|
-
redis:
|
|
53
|
-
# Tag-pinned, not digest-pinned. The Dockerfile argues for digests (#289)
|
|
54
|
-
# and that argument holds here too — a tag is mutable, so two `up`s a month
|
|
55
|
-
# apart can run different Redis builds. Pin the digest for a production
|
|
56
|
-
# deployment you need to reproduce:
|
|
57
|
-
# image: redis:7.2-alpine@sha256:<digest>
|
|
58
|
-
# Left as a tag in the template because a digest goes stale the week it is
|
|
59
|
-
# written and a scaffold that ships a stale one teaches nothing (#407).
|
|
60
|
-
image: redis:7.2-alpine
|
|
61
|
-
ports:
|
|
62
|
-
- "127.0.0.1:6379:6379"
|
|
63
|
-
healthcheck:
|
|
64
|
-
test: ["CMD", "redis-cli", "ping"]
|
|
65
|
-
interval: 5s
|
|
66
|
-
timeout: 3s
|
|
67
|
-
retries: 5
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# #407: without this file, the first `git add .` in a scaffolded project
|
|
2
|
-
# commits the two things a local setup creates right here — the signing key
|
|
3
|
-
# pair the README's Usage generates, and the `.env` (holding SESSION_SECRET)
|
|
4
|
-
# the compose files read.
|
|
5
|
-
|
|
6
|
-
# Secrets and per-machine configuration
|
|
7
|
-
# `.dockerignore` keeps the same out of the image (#705); change both together.
|
|
8
|
-
.env
|
|
9
|
-
.env.*
|
|
10
|
-
!.env.example
|
|
11
|
-
*.pem
|
|
12
|
-
*.key
|
|
13
|
-
config/clients.yaml
|
|
14
|
-
config/*.local.conf
|
|
15
|
-
|
|
16
|
-
# Build output and dependencies
|
|
17
|
-
node_modules/
|
|
18
|
-
dist/
|
|
19
|
-
coverage/
|
|
20
|
-
|
|
21
|
-
# Editor / OS noise
|
|
22
|
-
.DS_Store
|
|
23
|
-
*.log
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@o3co/auth-provider-standalone",
|
|
3
|
-
"version": "0.17.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"license": "Apache-2.0",
|
|
6
|
-
"engines": {
|
|
7
|
-
"node": ">=22.0.0"
|
|
8
|
-
},
|
|
9
|
-
"packageManager": "pnpm@10.29.3",
|
|
10
|
-
"type": "module",
|
|
11
|
-
"scripts": {
|
|
12
|
-
"build": "tsc",
|
|
13
|
-
"start": "node dist/app.mjs",
|
|
14
|
-
"debug": "NODE_OPTIONS='--conditions=development' tsx watch src/app.mts",
|
|
15
|
-
"test": "tsc --noEmit && vitest run --passWithNoTests"
|
|
16
|
-
},
|
|
17
|
-
"imports": {
|
|
18
|
-
"#/*": {
|
|
19
|
-
"development": "./src/*",
|
|
20
|
-
"default": "./dist/*"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@o3co/auth-provider-core": "workspace:*",
|
|
25
|
-
"@o3co/auth-provider-federation-google": "workspace:*",
|
|
26
|
-
"@o3co/auth-provider-federation-grants": "workspace:*",
|
|
27
|
-
"@o3co/auth-provider-federation-oidc": "workspace:*",
|
|
28
|
-
"@o3co/auth-provider-foundation": "workspace:*",
|
|
29
|
-
"@o3co/auth-provider-mfa": "workspace:*",
|
|
30
|
-
"@o3co/auth-provider-oauth": "workspace:*",
|
|
31
|
-
"@o3co/auth-provider-redis": "workspace:*",
|
|
32
|
-
"@o3co/auth-provider-session": "workspace:*",
|
|
33
|
-
"@o3co/auth-provider-standard": "workspace:*",
|
|
34
|
-
"@o3co/ts.hocon": "^1.13.0",
|
|
35
|
-
"connect-redis": "^10.0.0",
|
|
36
|
-
"express": "^5.2.1",
|
|
37
|
-
"express-session": "^1.19.0",
|
|
38
|
-
"helmet": "^8.3.0",
|
|
39
|
-
"ioredis": "^6.0.0",
|
|
40
|
-
"pino": "^10.4.0",
|
|
41
|
-
"prom-client": "^15.1.3",
|
|
42
|
-
"redis": "^6.3.0",
|
|
43
|
-
"zod": "^4.6.5"
|
|
44
|
-
},
|
|
45
|
-
"devDependencies": {
|
|
46
|
-
"@o3co/auth-provider-test-kit": "workspace:*",
|
|
47
|
-
"@types/express": "^5.0.6",
|
|
48
|
-
"@types/express-session": "^1",
|
|
49
|
-
"@types/node": "^26.6.4",
|
|
50
|
-
"@types/supertest": "^7.2.1",
|
|
51
|
-
"supertest": "^7.3.1",
|
|
52
|
-
"tsx": "^4.23.15",
|
|
53
|
-
"typescript": "^6.0.3",
|
|
54
|
-
"vitest": "^5.0.3"
|
|
55
|
-
}
|
|
56
|
-
}
|