- From: Jeffrey Yasskin <jyasskin@google.com>
- Date: Wed, 5 Apr 2017 09:57:41 -0700
- To: public-webauthn@w3.org
- Message-ID: <CANh-dXm-6p9+C6WodEPD=Bp1AgHjAGXnW6MLWQ_8fgqb+HSORw@mail.gmail.com>
I'm not going to be able to call in today, so I figured I'd send my pitch
to accept https://github.com/w3c/webauthn/pull/384 by email.
I think the biggest benefit of exposing webauthn credentials through the
same interface as passwords is that it lets us achieve Jeff Hodges' goal of
a single interface for webpages to use for sign-in, and with a small change
to #384 another single interface for credential creation.
For credential creation, the page needs to give the user a choice of which
kind of credential to create. Adding a couple more credential types, that
could look something like:
navigator.credentials.createAndStore({
accountInfo: {userid, username, userImage, siteName},
acceptableCredentials: {
password: {minEntropy: 64},
federated: {providers:["https://accounts.google.com", "
https://www.facebook.com", ...]},
sms: {
checkBy: {
send: function(number) {/*Ask the server to send an SMS*/},
vouch: [googleKey, samsungKey, appleKey, ...],
},
},
publicKey: { // <-- Better name for webauthn credentials.
attestationChallenge: crypto.getRandomValues(sixteen_byte_buffer),
cryptoParameters: [{algorithm: "ES256"}],
// Do we need a filter for acceptable attestation certificates?
},
}
});
The UI flow would be:
1) Get and validate a username, possibly taking advantage of
autocomplete="username" or autocomplete="email".
2) Call .createAndStore().
3) Potentially call .createAndStore() again to get a second factor.
You need a library to help manage the different credential types on the
server, but using a single call lets the browser guide the user through
their choice of credential types instead of needing to expose several "can
I use this" functions to the website.
Sign-in needs this unification a bit less, since most users have exactly
one credential for a given account, and in those cases, the site can
dispatch to the single call that works for that credential type. But some
users have multiple credentials for a given account, and in those cases,
letting the browser manage which credential to use would be useful.
navigator.credentials.get({
username,
password: true,
federated: {providers:["https://accounts.google.com", "
https://www.facebook.com", ...]},
sms: {
checkBy: {
send: function(number) {/*Ask the server to send an SMS*/},
},
},
publicKey: { // <-- Better name for webauthn credentials.
challenge: crypto.getRandomValues(sixteen_byte_buffer),
allowList: {id: id_for_username},
},
}
});
Jeffrey
Received on Wednesday, 5 April 2017 16:58:36 UTC