Maybe one extra thing you are missing is passkeys are resistant (not proof) to phishing. The user returns an 'assertion' that:
uses the private key to digitally sign a challenge value from the server, together with contextual information such as the requesting origin
https://developer.mozilla.org/en-US/docs/Web/Security/Authentication/Passkeys
It useless to pretend to be the bank as you'll get an assertion from the user you can't replay and the user's passkey implementation should spot the origin is wrong and refuse to sign it anyway (as I understand it).