Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/apps/api/ViGet/JavaProperties.cs
diff options
context:
space:
mode:
authorLeitwolf112026-10-23 04:49:52 +0300
committerLeitwolf112026-10-23 04:49:52 +0300
commitcffc8d884ce3620b70c80a9ab98b8f1f03887402 (patch)
tree2f74154b91cd33e170ae9726038880cb25548449 /apps/api/ViGet/JavaProperties.cs
parent46e526f91e805319e0b0b65bae8d09dc4fabfa0c (diff)
downloadprogmaweb-cffc8d884ce3620b70c80a9ab98b8f1f03887402.tar.gz
Add Progmasoft OAuth, an OAuth 2.1 and OpenID Connect provider
Progmasoft accounts can now sign in to any application, and any developer can register one. The provider runs in the account API under the Progmasoft.OAuth namespaces and answers on credentials.progmasoft.com. Protocol: OpenIddict 7 (Apache-2.0) with its Entity Framework stores. Authorization code with PKCE for every client, S256 only; refresh tokens with rotation and no reuse leeway, so a replayed refresh token revokes its chain; client credentials for confidential clients, without account scopes. No implicit or password grant. Codes live 2 minutes, access and identity tokens 15 minutes, refresh tokens 30 days. Signing (RSA) and encryption keys are read from files in production and are required there; other environments make keys per process. Scopes, one grant each, as the consent page lists them: profile (the account name), email (the sign-in address; email_verified is false, since registration does not verify it), viget.packages.read, viget.packages.publish and viget.packages.yank (access tokens for the viget audience), and offline_access. Pages, plain HTML without script, behind a content security policy that allows the one stylesheet by digest: sign-in with the account password (a cookie of its own, no account-site session), consent with the application, its registering account and the return host, the developer portal (register confidential or public clients, redirect address rules from RFC 8252, scopes, client credentials, secret shown once and rotatable, delete; 10 applications per account; other accounts' applications are absent), and the applications an account has allowed, with withdrawal that revokes their tokens. Forms carry antiforgery tokens; return addresses stay on the host. Storage: the oauth_* tables in the account database, created by a numbered schema step like the account tables; the step is the script Entity Framework generates for the model, and a test compares the two. With the memory account store they live in a shared in-memory SQLite database, which runs the bulk revocations the in-memory provider cannot. A host filter keeps OAuth paths on the OAuth host and everything but OAuth and /health off it. AllowedHosts names the new host, and a rate limit policy covers the protocol endpoints and the portal. The Nginx vhost for the host and the key set-up are in ops; docs/OAUTH.md is the developer guide. AccountService gains VerifyPasswordAsync, which LoginAsync now uses, and FindAsync. Verified: dotnet build with warnings as errors; dotnet test, 125 tests, 109 passed and 16 PostgreSQL tests skipped locally (CI runs them, including a new one for the schema and refresh token chain revocation): code flow with PKCE and the claims of each scope, single-use codes, refresh rotation and reuse refusal, consent reuse and withdrawal, deny, public client with a private-use scheme, client credentials, ViGet audience by introspection, refusal without PKCE, of other flows and of unpermitted scopes, unregistered redirect addresses, sign-in redirects and prompt=none, the portal's address rules and ownership, secret rotation, the page security policy, the host filter and the discovery document.
Diffstat (limited to 'apps/api/ViGet/JavaProperties.cs')
0 files changed, 0 insertions, 0 deletions