Build1 distinct publisher3 min readPublished
A working PingFederate 12.3.3 build keeps the browser, the IdP session and the application session apart, and reads the remembered-account cookie through a status-only adapter that never joins the login policy.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Merge the three states and the bug is predictable. A remembered identifier is a hint about who might sign in. The PingFederate authentication session is the only record of whether that person already proved it. The application session says nothing beyond whether this tab is signed in right now [3]. The author is blunt that a remembered account is not automatically a passwordless account [17], and that collapsing the three into one session produces repeated password prompts, stale panels and broken logout [2].
HttpOnly on the identifierFirstAdapter cookie prevents page script from reading it directly [7]. That is correct behavior, so the read has to happen server-side on PingFederate's own origin. Nothing about the demo topology lets you dodge that: the application is served from http://localhost:8080 and PingFederate from https://localhost:9031 [8], and those differ in both scheme and port, so the shared hostname buys you nothing [9]. Hence a status-only adapter that reads the native cookie and returns a sanitized list, with the widget drawing a chooser only when that list contains accounts [10]. The bridge itself is an origin-restricted iframe, sandboxed and nonce-carrying, delivering sanitized users to an allowed parent by postMessage [11].
Two decisions here are worth copying. The status endpoint stays out of the interactive policy, separate from the Identifier First and HTML Form sequence [13], so the chooser has no vote on an authentication outcome. And the adapter parses PingFederate's own representation, a URL-encoded comma-separated list of Base64-encoded identifiers, instead of minting a second account cookie, which the author notes would have added another source of identity state and made lifecycle behaviour harder to reason about [14][18]. A second cookie would drift out of sync with the Identifier First cookie as sessions changed, adding a stale copy of the same data with its own lifecycle to track.
The widget checks a remembered account with a silent authentication attempt rather than treating it as already signed in. It attempts authorization with prompt=none, and if silent authentication cannot complete it falls back to an interactive top-level request without forcing prompt=login [16]. Forcing it would violate the third rule the series sets itself, which is that a valid PingFederate session should let a remembered account continue with no further password prompt [5]. First sign-in is left alone: Identifier First collects the identifier, the HTML Form adapter validates the password, PingFederate records the successful identifier, and the callback validates state and exchanges the code with PKCE [15].
For the number of moving parts to be worth it in your environment, three things have to hold: the Identifier First adapter is already in your policy, you can deploy custom adapter code to a PingFederate 12.3.3 install [1], and you know the parent origin in advance. Note that both origins in this build are localhost [8]. Whether the hidden iframe still sees that cookie when the IdP sits on a different site rather than a different port is what I would test before promising anyone a silent sign-in.
Ranked by verification strength, evidence, and original report placement.
The browser, PingFederate and the web application each own different state, and treating those states as one session causes repeated password prompts, stale panels and broken logout behaviour.
The account chooser answers "who might sign in?", a valid PingFederate authentication session answers "has this user already proved who they are?", and the application session answers "is this browser tab currently signed in to this application?"
The web application owns the local signed-in state and the OIDC callback result, the PingFederate authentication session determines whether another password challenge is necessary, and the Identifier First adapter cookie remembers identifiers that completed authentication successfully; these states must be coordinated, not merged.
The target experience has four rules: a new visitor with no remembered identifier should not see a popup; the first sign-in should use the normal PingFederate authentication policy; a valid PingFederate session should let a remembered account continue without another password prompt; and logging out of the demo application should clear only the application session, then allow the account picker to appear again.
When the user selects "Log out of demo" the application clears its own state and resumes the chooser, and deliberately does not terminate the PingFederate session, which is why selecting a remembered account can complete silently after application logout.
PingFederate's Identifier First adapter owns a persistent HttpOnly cookie named identifierFirstAdapter.previous.subjects, and HttpOnly is described as correct because page JavaScript should not read authentication cookies.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Wrapping a web tool in VS Code: four sandbox rules, and two gaps in the published fix1 distinct publisher
build
A strict CSP killed one form in production, and every monitor stayed green1 distinct publisher
build
Chrome's auto-update default distributed the drainer once the extension changed hands1 distinct publisher
build
A Green Link Report Says Nothing About Whether Your HTTPS Page Renders1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One implementer, unusually checkable detail
The specifics are the strong part: identifierFirstAdapter.previous.subjects, /ext/one-tap/status, a nonce of 32 to 128 hex characters, frame-ancestors replacing X-Frame-Options. Those are things you can only write down if you built it, and a reader with a 12.3.3 instance can falsify any of them in an afternoon. What is absent is anyone who has. The whole account traces to one dev.to post by the code's author, and the published text stops mid-sentence where endpoint registration begins.
Two localhost ports and a repository link
Both endpoints in this story are localhost — the demo on 8080, PingFederate on 9031 — and the only distribution signal is a public repository the author points at. There is no report of this running against a hosted PingFederate, no second implementer, no stars, forks or downloads, and no indication that the pattern has been picked up. Published code is presence, not uptake, and we will not manufacture the difference.
The drama is in our headline, not the build
Our own framing says logout breaks silently; the author says the demo clears its session and deliberately leaves the PingFederate session alone, and then explains exactly why a remembered account can walk back in. That is a design decision described as one. The write-up is otherwise notably restrained — it states outright that a remembered account is not a passwordless account, and it declines to force prompt=login on fallback rather than claiming seamless sign-in. The gap that exists is ours: a deliberate boundary rendered as a failure.
Portfolio, not payroll
This is an engineer publishing his own project under his own handle as part one of a series — the payoff is credibility and traffic to the repository, which pushes toward more disclosure rather than less. Nothing in the piece shows Ping Identity involvement, sponsorship, or a product for sale. The softer bias is structural: the author is both designer and reviewer, so every decision arrives pre-justified, including the one that strips a security header off a PingFederate endpoint.
Firm on mechanics, thin on verdict
Hold the cookie names, endpoint path, header changes and flow ordering fairly firmly; they are internally consistent and independently testable. Hold the conclusions loosely. One author, one localhost build, one instalment of an unfinished series, and no external check on whether the bridge is as tight as described or whether the pattern survives a production origin. Enough to build from with your eyes open; not enough to standardise on.