{"id":15687,"date":"2025-12-17T12:31:02","date_gmt":"2025-12-17T06:31:02","guid":{"rendered":"https:\/\/dtasiagroup.com\/?p=15687"},"modified":"2025-12-17T12:31:02","modified_gmt":"2025-12-17T06:31:02","slug":"ux-best-practices-for-passkeys-understanding-device-initiated-authentication","status":"publish","type":"post","link":"https:\/\/dtasiagroup.com\/vi\/ux-best-practices-for-passkeys-understanding-device-initiated-authentication\/","title":{"rendered":"UX Best Practices for Passkeys: Understanding Device-Initiated Authentication"},"content":{"rendered":"<div class=\"container centre-align\">\n<div class=\"blog-header\"><img decoding=\"async\" class=\"blog-hero-img\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/6768c54f717640eb151d502c_User%20Experience%20Guidelines%20(3).png\" sizes=\"100vw\" srcset=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/6768c54f717640eb151d502c_User%20Experience%20Guidelines%20(3)-p-500.png 500w, https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/6768c54f717640eb151d502c_User%20Experience%20Guidelines%20(3)-p-800.png 800w, https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/6768c54f717640eb151d502c_User%20Experience%20Guidelines%20(3).png 1024w\" alt=\"Device-Initiated Authentication vs Username-Initiated Authentication\" \/><\/div>\n<\/div>\n<div class=\"container blog\">\n<div class=\"article-body\">\n<div class=\"rich-text w-richtext\">\n<p>&nbsp;<\/p>\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"da5b9b78-b188-41fc-8312-1ec86d5d8829\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"0\" data-end=\"229\" data-is-last-node=\"\" data-is-only-node=\"\">Passkeys are different from traditional username-based approaches to passwordless sign-in and MFA. This article explains how to design the most effective passkey experience for users, with a focus on web browsers as the platform.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>&#x200d;<\/p>\n<h3>Username-initiated authentication<\/h3>\n<div class=\"flex flex-col text-sm\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"e01999dd-42a7-49de-a480-3ce8afdd03b8\" data-testid=\"conversation-turn-6\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"e171e51b-b4bf-4bf7-adfa-9942425378d4\" data-message-model-slug=\"gpt-5-mini\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"0\" data-end=\"246\" data-is-last-node=\"\" data-is-only-node=\"\">On web browsers, traditional passwordless sign-in usually starts with the user providing some form of identifier. For instance, the user might be asked to enter their email address to trigger a challenge through an email OTP code or a magic link.&#x200d;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<figure class=\"w-richtext-align-fullwidth w-richtext-figure-type-image\">\n<div><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/676385fa64a8b1fa7d9eda6a_676385f52d5790b99efd9e09_email-otp%2520(2).png\" alt=\"\" \/><\/div>\n<\/figure>\n<p>The email address here acts as a username which is necessary both to look up the account and to verify that it belongs to the user. We need to find the account associated with the email address and then send out an email that can be used to verify account ownership.<\/p>\n<p>&#x200d;<\/p>\n<h3>Device-initiated authentication<\/h3>\n<p data-start=\"0\" data-end=\"178\">A key difference between passkeys and traditional passwordless sign-in is that authentication doesn\u2019t need to start with the user entering a username, such as an email address.<\/p>\n<p data-start=\"180\" data-end=\"607\">This is because passkeys are tied to devices\u2014either restricted to a single device (\u201cdevice-bound\u201d) or synced across multiple devices via a backend service (e.g., iCloud Keychain or Google Password Manager). As a result, we can show the passkeys available on the device without first asking the user for their username. When the user selects a passkey, an internal identifier on the credential is used to locate their account.<\/p>\n<p data-start=\"609\" data-end=\"824\" data-is-last-node=\"\" data-is-only-node=\"\">Typically, a user will have at most one passkey per website. However, if a device is shared among family members or if a user has multiple accounts on the same site, multiple passkeys may be presented for selection.<\/p>\n<figure class=\"w-richtext-align-normal w-richtext-figure-type-image\">\n<div><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/67623263f2231b29ba2741e0_6762304a84ec64285c70ffcf_multiple-passkeys.png\" alt=\"\" \/><\/div>\n<\/figure>\n<p>&#x200d;<\/p>\n<h3>Passkey autofill<\/h3>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:32c89034-9d5a-4b91-a029-49094d1e70e8-8\" data-testid=\"conversation-turn-10\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"c488cd8f-bb94-4cad-9308-d5b40fb6b073\" data-message-model-slug=\"gpt-5-mini\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"0\" data-end=\"278\" data-is-last-node=\"\" data-is-only-node=\"\">Passkey autofill is an example of device-initiated authentication. While it does require a username input field, the user only needs to focus on this field to view and select any available passkeys. They don\u2019t have to finish typing their username to access and choose a passkey.<\/p>\n<p data-start=\"0\" data-end=\"278\" data-is-last-node=\"\" data-is-only-node=\"\"><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/67623263f2231b29ba2741d7_67623081e1c11773f07702c3_autofill-1.png\" alt=\"\" \/><\/p>\n<p data-start=\"0\" data-end=\"278\" data-is-last-node=\"\" data-is-only-node=\"\">Because it only shows passkeys if they\u2019re available on the device, the autofill feature is an unobtrusive way to introduce passkeys to your sign-in page. If the user hasn\u2019t set up a passkey yet and doesn\u2019t know what they are, then they can still enter their username and proceed through a more familiar passwordless authentication challenge such as email OTP. But for users who do select an autofilled passkey, the site can look up their account based on the passkey selected. In addition, the site can authenticate the user at the same time by looking up the public key associated with the account and using it to verify the signature generated by the passkey\u2019s private key.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"blog-cta-container\"><\/div>\n<div class=\"article-body\">\n<div class=\"rich-text w-richtext\">\n<h3><\/h3>\n<h3>A passkey sign-in button<\/h3>\n<p>Another way of supporting passkey sign-in, which can be used alongside autofill, is to add a separate button that is clearly labeled as a passkey sign-in option.<\/p>\n<p>&#x200d;<span style=\"text-decoration: underline;\"><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/67623263f2231b29ba2741d1_676230d0f5ed113a6d002b48_passkey-button.png\" \/><\/span>&#x200d;<\/p>\n<p>In the above example, a passkey sign-in button is presented as an alternative to the traditional option of entering a username. Like autofill, this button is an example of device-initiated authentication. If the user presses the button, the browser can prompt the user to authenticate with a passkey available on the device.&#x200d;<\/p>\n<figure class=\"w-richtext-align-normal w-richtext-figure-type-image\">\n<div><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/67623263f2231b29ba2741e8_676230f47f54148fabf45cd0_passkey-button-prompt.png\" alt=\"\" \/><\/div>\n<\/figure>\n<p>In contrast to autofill, however, the scenario where a device doesn&#8217;t have any passkeys available is handled differently. The button is forcing the browser to initiate passkey authentication without knowing whether or not the device has any available; if none are available, then the browser has to fall back on displaying a QR code or wait for the user to insert a security key.<\/p>\n<p>&#x200d;<\/p>\n<figure class=\"w-richtext-align-normal w-richtext-figure-type-image\">\n<div><img decoding=\"async\" src=\"https:\/\/cdn.prod.website-files.com\/65e95b064168fb52387963b3\/67623263f2231b29ba2741f6_6762311e8f9403a9bf99fa3a_qr-code.png\" alt=\"\" \/><\/div>\n<\/figure>\n<p>This may be a valid scenario if the user has previously created a passkey for the site on a different device, and it can&#8217;t be synced to their current device. For example, if they originally created the passkey on an iPhone and are now trying to sign-in on a Windows desktop browser, then they can scan the QR code with their iPhone.<\/p>\n<p>However, the QR code can also be a jarring experience for users who haven&#8217;t previously created a passkey or who aren\u2019t familiar with the nuances of how passkeys get synced across different devices. For this reason, it&#8217;s important to trigger the QR code flow from a user-interaction, like a passkey sign-in button, where the user has explicitly opted to use passkeys. We want to avoid launching the QR code flow from a context where the user may not anticipate or understand it.<\/p>\n<p>&#x200d;<\/p>\n<h3>Username-initiated passkey sign-in<\/h3>\n<p data-start=\"0\" data-end=\"274\">In certain situations, it makes sense to restrict the browser to presenting passkeys for a single user. For instance, when passkeys are used as a secondary factor for MFA, you only want to display passkeys belonging to the user who completed the first authentication step.<\/p>\n<p data-start=\"276\" data-end=\"460\" data-is-last-node=\"\" data-is-only-node=\"\">This can be accomplished using the\u202f<code data-start=\"311\" data-end=\"329\">allowCredentials<\/code>\u202fparameter, which lets you instruct the browser to limit the list of available credentials to those registered for a specific user.<\/p>\n<p>While MFA is the most typical scenario where\u00a0<code>allowCredentials<\/code>\u00a0would be used, what if you want to use it to design a passwordless sign-in flow? For example, you could prompt the user to manually input their username, look up their account in your system, and then start an authentication challenge by presenting only the passkeys for that user.<\/p>\n<p>Although\u00a0<code>allowCredentials<\/code>\u00a0does make this possible, there are some limitations to consider. Even if you restrict the browser to a list of credentials for a given user, you can&#8217;t know whether those credentials are available on the device that the user is currently authenticating on. For example, the user may be on a device where the passkey they previously created can&#8217;t be synced. Alternatively, they may have deleted the passkey from their password manager. For this reason, it&#8217;s crucial to always clearly present a backup authentication option, even when using\u00a0<code>allowCredentials<\/code>.<\/p>\n<p>&#x200d;<\/p>\n<h3>Summary<\/h3>\n<ul role=\"list\">\n<li>While traditional passwordless authentication like email OTP is often \u201cusername-initiated\u201d, passkeys represent a new paradigm of \u201cdevice-initiated\u201d authentication.<\/li>\n<li>Autofill is an unobtrusive way to add support for passkeys on your sign-in page while also supporting traditional passwordless sign-in based on a username.<\/li>\n<li>A passkey sign-in button can complement autofill by presenting whatever passkeys are available on the device (or a QR code if none are available).<\/li>\n<li>While the\u00a0<code>allowCredentials<\/code>\u00a0flag does make it possible to look up the user first by their username and then show only their passkeys, it\u2019s always a possibility that none of their passkeys will be available on the device and that they\u2019ll see a QR code; so you should always clearly present an alternative sign-in method and avoid leading users into dead ends.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>About DT Asia<\/strong><\/p>\n<p>DT Asia began in 2007 with a clear mission to build the market entry for various pioneering IT security solutions from the US, Europe and Israel.<\/p>\n<p>Today, DT Asia is a regional, value-added distributor of cybersecurity solutions providing cutting-edge technologies to key government organisations and top private sector clients including global banks and Fortune 500 companies. We have offices and partners around the Asia Pacific to better understand the markets and deliver localised solutions.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>How we help<\/strong><\/p>\n<p>If you need to know more about UX Best Practices for Passkeys: Understanding Device-Initiated Authentication, you\u2019re in the right place, we\u2019re here to help! DTA is Versasec\u2019s distributor, especially in Singapore and Asia, our technicians have deep experience on the product and relevant technologies you can always trust, we provide this product\u2019s turnkey solutions, including consultation, deployment, and maintenance service.<\/p>\n<p>Click here and here and here to know more:\u00a0<a href=\"https:\/\/dtasiagroup.com\/authsignal\/\">https:\/\/dtasiagroup.com\/authsignal\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Passkeys are different from traditional username-based approaches to passwordless sign-in and MFA. This article explains how to design the most effective passkey experience for users, with a focus on web browsers as the platform.<\/p>","protected":false},"author":11,"featured_media":15689,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[],"class_list":["post-15687","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles"],"_links":{"self":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/15687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/comments?post=15687"}],"version-history":[{"count":2,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/15687\/revisions"}],"predecessor-version":[{"id":15691,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/15687\/revisions\/15691"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/media\/15689"}],"wp:attachment":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/media?parent=15687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/categories?post=15687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/tags?post=15687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}