The Hidden Similarity Between Event Systems and Passwordless Login: Trust by Design, Not by Hope
Hatched by tfc
May 23, 2026
10 min read
5 views
89%
The Real Question: What Should We Refuse to Trust?
What do a distributed event pipeline and a biometric login flow have in common? At first glance, almost nothing. One is about messages flying between services. The other is about a person proving who they are. Yet both are built around the same uncomfortable truth: you cannot reliably trust the moment in front of you.
A service can retry. A network can duplicate. A user can mistype. A device can disappear. A request can arrive twice, late, out of order, or from a context that no longer exists. The systems that survive these realities are not the ones that pretend the world is clean. They are the ones that treat uncertainty as a design constraint.
That is the deeper connection here. Both event-driven architecture and passwordless authentication are really disciplines of structured distrust. They do not ask, “Can I trust this message or this person?” They ask, “How do I design the system so trust is established through rules, boundaries, and repetition resistant checks?”
The strongest systems do not eliminate uncertainty. They make uncertainty harmless.
Two Kinds of Fragility, One Design Philosophy
In a synchronous system, a caller waits for an answer. That feels direct, even natural. But synchronous designs make one component emotionally dependent on another. If the receiver is slow, unavailable, or overloaded, the whole interaction inherits that fragility. Asynchronous design takes a different bet: send the event, move on, and let the system absorb the delay.
That shift is not only technical. It is philosophical. It replaces the illusion of immediate certainty with a more realistic contract: the work will happen, but not necessarily now, and not necessarily once. The message might be delivered twice. The target might be temporarily down. The response might be irrelevant by the time it arrives. So the system must be built with decoupling, idempotency, and tolerant timing.
Passwordless authentication through WebAuthn and custom challenge flows uses the same philosophy, but aimed at identity. Instead of asking the user to transmit a secret that can be copied, replayed, or phished, the system asks the authenticator to prove possession of a private key that never leaves the device. The server stores only what it needs to verify the proof: the public key and the credential reference.
This is the crucial move in both domains: never trust the fragile thing directly. Do not trust that an event arrives once. Do not trust that a password proves identity. Design so that neither duplication nor interception can break the outcome.
If that sounds abstract, imagine a concert venue.
A naive ticketing system trusts the ticket image itself. A stronger system trusts a barcode that can be validated against a server. A still stronger system assumes tickets may be duplicated, and so it checks identity, scans once, marks entry, and rejects replay. Passwordless authentication does something similar with a human at the gate. Event systems do it with messages between services. Both are trying to solve the same problem: proof must be bound to context, not merely copied as content.
Fire and Forget Is Not Carelessness, It Is a Boundary
The phrase fire and forget sounds irresponsible until you understand what it is protecting. It is not about ignoring the result. It is about refusing to make progress depend on another component’s immediate mood. When a service publishes an event to a queue or bus and continues, it is saying: “My responsibility is to declare that something happened. Another part of the system will decide what to do next.”
That boundary matters because waiting for every downstream action creates a chain of hidden couplings. The sender becomes hostage to the receiver. The receiver becomes a bottleneck. The system becomes more fragile with every added dependency.
This is where event routing becomes meaningful. A bus such as EventBridge is not just a plumbing convenience. It is a way to encode separation of concerns into the topology itself. Producers emit facts. Consumers subscribe to meaning. Routing decides where an event should go without forcing the producer to know who cares.
Passwordless authentication has an analogous boundary. During registration, the system does not ask the user to repeatedly prove identity with every interaction. It creates a credential relationship once, binds it to the relying party, and stores the public key in the user profile. During login, the authenticator responds to a challenge that is specific to the application context. The private key remains sealed inside the device. The server verifies, but it does not possess the secret.
That is a boundary worth noticing: the system never asks the user to carry the whole burden of trust on every request. It establishes a durable relationship, then uses short-lived proof when needed.
You can think of this as the difference between a handshake and a photograph. A photograph can be copied endlessly. A handshake happens in a specific place, between specific parties, under specific conditions. Event systems and passwordless login both depend on the handshake model. The value lies not in the data alone, but in the context that produced it.
Idempotency and Challenge Response Share a Deeper Grammar
The word idempotency sounds like a technical footnote, but it is actually one of the most powerful ideas in system design. It means repeating the same operation does not change the result after the first successful execution. This matters because distributed systems cannot guarantee perfect delivery semantics. If you design as though every event arrives exactly once, reality will punish you.
Idempotency is a refusal to let repetition become corruption.
That same refusal appears in passwordless authentication. A challenge response should be valid only for the right credential, the right relying party, and the right moment in time. Even if an attacker captures part of the interaction, the protocol should prevent reuse in a different context. The proof is not a reusable token floating in the wild. It is a response bound to a challenge, a device, and a relying party.
This reveals a useful mental model: idempotency is for actions, challenge response is for identity, but both are about binding consequences to context.
Consider an example from retail.
A checkout service receives an order event twice because the network retried the message. Without idempotency, the customer is charged twice. With idempotency, the second event is recognized as a duplicate and safely ignored or merged. Now compare that to login. If someone copies a challenge response and tries to use it later, the system should treat it as invalid because the challenge is no longer in the right context. In both cases, the system is not merely checking whether the data looks plausible. It is checking whether the data still belongs to the moment that created it.
This is the grammar shared by resilient systems:
- State what happened rather than what should happen.
- Bind each proof to a context so it cannot be replayed elsewhere.
- Make repetition safe because repetition is inevitable.
The surprising insight is that these are not separate concerns. They are variations of a single principle: a valid act of trust must be impossible to confuse with a copy.
Orchestration, Authentication, and the Limits of Central Control
There is a temptation in complex systems to overcentralize. If we feel uncertain, we reach for a conductor, a controller, a master workflow, a single place where everything can be checked. Step Functions is powerful precisely because it can coordinate complex workflows, reduce glue code, and make state explicit. In a world of distributed pieces, orchestration offers a readable story.
But orchestration has a hidden danger: it can seduce teams into believing complexity has been solved when it has merely been relocated.
The same tension exists in authentication. A custom authentication flow in Cognito can orchestrate multi-step challenge and response behavior elegantly. It can check a user’s profile, invoke Lambda functions, and confirm the correct authenticator. Yet even here, the system’s security does not come from central supervision alone. It comes from the cryptographic and contextual constraints embedded in the flow. The orchestrator coordinates, but the proof remains local to the authenticator and the relying party.
This suggests a broader rule: orchestration should manage sequence, not manufacture trust.
That distinction is easy to miss. A workflow engine can say what happens next. It cannot magically make a duplicated event unique, nor can it transform a stolen password into a trustworthy identity. It can only shape the conditions under which trust is evaluated. Likewise, a biometric login does not “know” the user in a human sense. It verifies a challenge using a credential that remains anchored to a device and a specific application context.
Think of a train system. The central timetable can coordinate departures, but it cannot prevent a passenger from boarding the wrong train if the ticket is bad. Security lives in the ticket validation, not the schedule. In the same way, coordination and trust are different layers. Confusing them leads to brittle systems that look organized until the first real failure.
A Unifying Framework: Trust in Motion, Trust at Rest
The deepest synthesis here is a two-part framework that applies to both distributed systems and identity systems.
1. Trust in motion
This is the moment a message is sent or a challenge is issued. The system assumes the channel is unreliable, the delay is unknown, and the participant may not respond exactly once. At this stage, the job is to reduce coupling and prevent fragile assumptions.
Examples:
- Publish an event and continue instead of blocking on downstream work.
- Issue a challenge rather than accepting a reusable secret.
- Route messages through a bus instead of hard-coding consumers.
2. Trust at rest
This is the moment after the event or proof arrives. The system must decide whether the input belongs in the current state. At this stage, the job is to prevent replay, duplication, and misuse.
Examples:
- Make handlers idempotent so repeated events do not cause damage.
- Verify credentials against stored public keys and relying party context.
- Keep the private key off the server, where it cannot be copied.
The beauty of this framework is that it reduces many design choices to a single question: Where should trust live, in motion or at rest?
If trust lives in motion, you need strong boundaries, temporary proof, and loose coupling. If trust lives at rest, you need durable records, deduplication, and verification against context. Most failures happen when systems confuse the two, asking a moving thing to behave like a stable one or a stable thing to prove something it was never meant to prove.
Key Takeaways
- Do not trust immediacy. Whether it is an event or a login request, the fact that something happened now does not make it reliable.
- Design for repetition. Duplicate events, retries, and repeated challenge flows are not edge cases. They are the real operating environment.
- Bind proofs to context. A message, a credential, or a response is only meaningful inside the system that expects it.
- Separate coordination from trust. Orchestration can manage sequence, but it cannot replace verification.
- Move secrets off the network and outcomes out of the critical path. That is how you build systems that fail gracefully instead of dramatically.
The End of Naive Trust
The old way of designing systems asked for confidence too early. It assumed messages would arrive cleanly, users would prove themselves with static secrets, and workflows could be made safe by centralizing control. But modern systems live in a world of retries, duplication, latency, phishing, and partial failure. In that world, naive trust is not a virtue. It is a liability.
The better approach is less romantic and more durable. Treat every input as potentially repeated, delayed, or contextless. Treat every identity proof as something that must be bound to a device and a relying party. Treat orchestration as a way to shape motion, not to create certainty. When you do, you build systems that are not only more secure and scalable, but more honest about how the world actually works.
The real lesson is not that events and fingerprints are similar. It is that reliability comes from designing against misuse, not from hoping misuse will not happen. Once you see that, both event architecture and passwordless authentication stop looking like separate specialties. They become expressions of the same mature idea: trust is not a feeling. It is an architecture.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣