yavsc/src
Paul Schneider 512a0ef06f PostIt: switch OIDC client from confidential (client_secret) to public (PKCE/JWT)
PostIt is a desktop/mobile app talking to Yavsc.Org
(https://yavsc.pschneider.fr) as an OIDC identity provider. The
previous grant used the client_credentials flow with a client_secret
embedded in postit-settings.json: this was both insecure (secret
travels with the binary) and inappropriate for an interactive app
(token had no user identity, so the API could not scope or audit).

The new flow is Authorization Code + PKCE:

  * PostIt client (Settings/AuthenticationSettings.cs): the
    ClientSecret property is removed; GetOidcClientOptions now drops
    the secret and accepts an optional IBrowser supplied per-platform.
  * Settings.cs: new AndroidRedirectUri constant ('android://postit-signin')
    that the Android app uses; RedirectUri is no longer hard-coded in
    MainViewModel.
  * MainViewModel.cs: the manual discovery + client_credentials POST is
    replaced with OidcClient.LoginAsync (Authorization Code + PKCE).
  * Settings sample: Authority points at the real Yavsc.Org OP, not at
    a non-existent Keycloak-style realm path.
  * Yavsc.Org/Extensions/HostingExtensions.cs: the 'postit' client seed
    is now idempotent (MigratePostItClientToPublic) and detects
    legacy state on existing ConfigurationDb rows - flips
    RequireClientSecret=false, RequirePkce=true, drops any ClientSecret
    row, and replaces the legacy RedirectUris
    (https://yavsc.pschneider.fr/, yavsc://callback) with the current
    set (http://127.0.0.1:7890/, android://postit-signin).

PostIt.Android:

  * MainActivity: explicit Name attribute so the activity alias can
    target a stable component; LaunchMode.SingleTask so the existing
    instance receives the deep-link Intent; OnNewIntent forwards the
    callback URI through AndroidOidcCallbackSink.
  * AndroidManifest.xml: activity-alias PostIt.Android.OidcCallbackActivity
    exposing scheme=android host=postit-signin to Android, so the OP
    redirect lands back in the running PostIt instance.

The IdentityModel.OidcClient.Browser.SystemBrowser package and a
thin AndroidSystemBrowser implementation are added in a follow-up so
OidcClient.LoginAsync can actually drive Chrome Custom Tabs and
consume AndroidOidcCallbackSink.
2026-06-20 17:16:07 +01:00
..
cli Split Directory.Packages.props: shared versions in root, per-product in src/ 2026-06-19 18:51:18 +01:00
PostIt PostIt: switch OIDC client from confidential (client_secret) to public (PKCE/JWT) 2026-06-20 17:16:07 +01:00
PostIt.Tests Split Directory.Packages.props: shared versions in root, per-product in src/ 2026-06-19 18:51:18 +01:00
templateWeb fices the UI 2026-06-15 02:55:22 +01:00
Yavsc.Abstract fices the UI 2026-06-15 02:55:22 +01:00
Yavsc.Api deploying the blogs 2026-06-19 23:09:43 +01:00
Yavsc.Blogs deploying the blogs 2026-06-19 23:09:43 +01:00
Yavsc.Org PostIt: switch OIDC client from confidential (client_secret) to public (PKCE/JWT) 2026-06-20 17:16:07 +01:00
Yavsc.Org.Tests reinstall fixes and reorg 2026-06-19 21:13:17 +01:00
Yavsc.Server deploying the blogs 2026-06-19 23:09:43 +01:00
Yavsc.Web Split Directory.Packages.props: shared versions in root, per-product in src/ 2026-06-19 18:51:18 +01:00