Passkeys and PSD2 Strong Customer Authentication
Strong customer authentication asks for two independent elements and, for payments, a cryptographic binding between the authorisation and the transaction it authorises. A passkey ceremony supplies the authentication half cleanly; the binding and the disclosure around it remain application work. This page covers where each requirement lands and what a compliant implementation actually has to build. It sits under Enterprise Policy and Compliance Controls.
Requirement Reference
| Requirement | Supplied by | Still to build |
|---|---|---|
| two independent elements | possession plus authenticator verification | evidence that verification occurred |
| replay resistance | single-use challenge | atomic consumption and expiry |
| dynamic linking | — | transaction-derived challenge |
| user disclosure | — | amount and payee shown at approval |
| exemptions | — | policy and audit trail |
The two empty cells in the middle column are the whole of the payments-specific work.
Root Cause Analysis
1. Treating the ceremony as sufficient. A passkey assertion proves someone with the credential approved something. Without a transaction-derived challenge it does not prove what they approved, which is exactly what dynamic linking exists to establish.
2. Deriving the challenge but not showing the transaction. The requirement has two halves: the authorisation must be bound to the amount and payee, and the user must be made aware of them. A cryptographic binding the user never saw satisfies one half of an obligation that has two.
3. Assuming the flag distinguishes biometric from PIN. It reports that the authenticator verified the user, not how. Where a framework distinguishes inherence from knowledge, the honest position is that the ceremony establishes one of them without saying which.
4. Ignoring the recovery path. An authentication regime satisfied at sign-in and bypassed by a weak recovery flow has not achieved what it set out to, and this is the area assessors probe hardest in payments.
Step-by-Step Resolution
Step 1 — derive the challenge from the transaction
Bind the amount, the payee and a transaction identifier into the value you issue, and store them on the challenge record. The assertion then authorises that transaction rather than a session.
Step 2 — show what is being approved
Amount and payee, in the interface, at the moment the ceremony is triggered. The platform prompt cannot carry your transaction details, so the disclosure has to be on your page immediately before it.
Step 3 — consume the challenge against the transaction
At verification, look up the challenge, confirm it corresponds to the transaction being executed, and consume it atomically. A challenge redeemable against a different transaction defeats the binding.
Step 4 — require user verification for payments
Request it, check the flag, and refuse the authorisation if it is clear. This is the element the regime depends on, and the check is server-side.
Step 5 — record the evidence
Transaction identifier, challenge, credential, verification result and timestamp, in one record. This is what an assessment will ask to see.
Step 6 — design the exemptions deliberately
Low-value and recurring-payment exemptions are policy decisions with their own audit requirements, and they belong in the same table as the assurance requirements rather than scattered through payment handlers.
Verification and Testing
Assert that an assertion issued for one transaction cannot authorise another. Create two payments, obtain a challenge for the first, and attempt to complete the second with it. The attempt must fail at the challenge lookup, and this single test is the one that proves dynamic linking is implemented rather than intended.
Assert that an unverified ceremony cannot authorise a payment, using a virtual authenticator configured without user verification.
Assert the evidence record exists and is complete after a successful authorisation, because the record is the deliverable an assessment consumes.
Pitfalls
1. A session-wide “approved” flag. Lets any subsequent payment ride on one ceremony, which is precisely what dynamic linking forbids.
2. Showing the transaction after the prompt. The disclosure has to precede the approval, or the user approved something they had not seen.
3. Treating the recovery flow as out of scope. It is the path an attacker will use, and it is in scope in every assessment.
Frequently Asked Questions
Does a passkey satisfy two elements on its own?
Where the authenticator verified the user, the ceremony combines possession of a non-exportable key with a verification the device performed, which is the standard argument for a single multi-factor authenticator. Confirm the reading with whoever owns compliance, because the framework’s wording rather than the technology decides it.
How do I bind a challenge to a transaction?
Generate the challenge as normal from a cryptographically secure source, and store it alongside the transaction identifier, amount and payee rather than encoding those values into it. The binding is the stored association plus the check at consumption; embedding data in the challenge adds nothing and constrains its entropy.
Can the platform prompt show the amount?
No. The prompt is owned by the operating system and shows the relying party, not your transaction details. The disclosure must be on your own page immediately before the ceremony, which is why the requirement is an interface obligation as much as a protocol one.
What about recurring payments?
They generally fall under an exemption rather than requiring a ceremony per instalment, but the initial mandate is the authorisation that matters and should carry the full binding. Record the mandate with the same evidence as any other authorisation.
Does the flag tell me whether a biometric or a PIN was used?
No, and it is not intended to. It reports that the authenticator’s user-verification method succeeded. Where a framework distinguishes inherence from knowledge, describe what the flag establishes rather than claiming the stronger of the two.
How does this interact with a fallback path?
Any fallback must reach the same standard, including the dynamic linking. A payment authorised through a weaker path than the primary one is the gap most likely to be found, and the usual remedy is to hold the fallback to the same requirements rather than to remove it.
Designing the Approval Screen
Because the platform prompt cannot carry your transaction, the screen immediately before it becomes a regulated surface rather than a design detail, and it is worth treating as such.
Show the amount and the payee in the same visual weight as the confirm action, not as supporting text beneath it. The obligation is that the user is made aware of what they are approving, and an amount rendered in small grey type below a large green button does not obviously discharge it.
Trigger the ceremony from the confirm control itself, in the same handler. Any intermediate step — a summary page, an await on a network call that fetches the challenge — risks the user activation lapsing, and it also opens a gap between what was displayed and what was authorised if the transaction can change in between.
Keep the challenge and the transaction immutable together. Once a challenge has been issued for a payment, neither the amount nor the payee may change; if the user edits either, issue a new challenge and discard the old one. A mutable transaction with a live challenge is the shape that makes the binding meaningless.
Handle the refusal path as an ordinary outcome. A user who dismisses the prompt has not failed authentication; they have declined to approve a payment, and the interface should return them to the transaction with both the confirm action and any alternative still available. Routing that into a generic authentication error is both a poor experience and a misrepresentation of what happened, which matters when the event ends up in an audit trail.
Related
- Enterprise Policy and Compliance Controls — the parent topic area and the control matrix
- Mapping Passkeys to NIST AAL2 and AAL3 — the assurance-level framing of the same mechanisms
- Step-Up Authentication with Passkeys — binding an assertion to a specific action
- Best Practices for FIDO2 Challenge Generation — the challenge properties dynamic linking depends on