Avec tout le buzz récent autour de la spécification FIDO U2F, je voudrais implémenter FIDO U2F sur un banc d'essai pour être prêt pour le prochain déploiement de la spécification finale.
Jusqu'à présent, j'ai une clé de sécurité FIDO U2F produite par Yubico et l'extension FIDO U2F (Universal 2nd Factor) installée dans Chrome. J'ai également réussi à configurer la clé de sécurité pour qu'elle fonctionne avec ma connexion Google.
Maintenant, je ne sais pas comment utiliser ces trucs pour mon propre site. J'ai parcouru la page Github de Google pour le projet U2F et j'ai vérifié leur front-end de l'application web . Cela semble vraiment simple (JavaScript uniquement). L'implémentation de l'authentification du deuxième facteur avec FIDO est-elle donc aussi simple que l'implémentation de quelques appels JavaScript? Tout ce qui semble se produire pour l'enregistrement dans l'exemple est le suivant:
var registerRequest = {
appId: enrollData.appId,
challenge: enrollData.challenge,
version: enrollData.version
};
u2f.register([registerRequest], [], function (result) {
if (result.errorCode) {
document.getElementById('status')
.innerHTML = "Failed. Error code: " + result.errorCode;
return;
}
document.location = "/enrollFinish"
+ "?browserData=" + result.clientData
+ "&enrollData=" + result.registrationData
+ "&challenge=" + enrollData.challenge
+ "&sessionId=" + enrollData.sessionId;
});
Mais comment puis-je l'utiliser moi-même pour une implémentation? Pourrai-je utiliser le rappel de cet appel de méthode pour l'enregistrement de l'utilisateur?
Ce que vous essayez de faire est d'implémenter une soi-disant "partie de confiance", ce qui signifie que votre service Web s'appuiera sur l'assertion d'identité fournie par le jeton FIDO U2F.
Vous aurez besoin de comprendre les spécifications U2F pour ce faire. Surtout comment le paradigme défi-réponse doit être mis en œuvre et comment fonctionnent les identifiants et les facettes des applications. Ceci est décrit dans la spécification en détail.
Vous avez raison: le code réel nécessaire pour travailler avec FIDO U2F à partir de l'extrémité avant de votre application est presque trivial (c'est-à-dire, si vous utilisez l'API JavaScript "de haut niveau" par opposition à l'API MessagePort "de bas niveau") . Votre application devra cependant travailler avec les messages générés par le token et les valider. Ce n'est pas anodin.
Pour illustrer comment vous pouvez poursuivre la mise en œuvre d'un site de partie de confiance, je vais donner quelques exemples de code, tirés d'un Virtual FIDO U2F Token Extension que j'ai programmé récemment pour des raisons académiques. Vous pouvez voir la page pour l'exemple de code complet.
Avant que vos utilisateurs puissent utiliser leurs jetons FIDO U2F pour s'authentifier, ils doivent l'enregistrer avec vous. Pour leur permettre de le faire, vous devez appeler window.u2f.register
dans leur navigateur. Pour ce faire, vous devez fournir quelques paramètres (encore une fois; lisez les spécifications pour plus de détails). Parmi eux, un défi et le id de votre application. Pour une application Web, ceci id doit être l'origine Web de la page Web déclenchant l'opération FIDO. Supposons que ce soit example.org
:
window.u2f.register([
{
version : "U2F_V2",
challenge : "YXJlIHlvdSBib3JlZD8gOy0p",
appId : "http://example.org",
sessionId : "26"
}
], [], function (data) {
});
Une fois que l'utilisateur effectue un "test de présence utilisateur" (par exemple en touchant le jeton), vous recevrez une réponse, qui est un objet JSON (voir spécification pour plus de détails)
dictionary RegisterResponse {
DOMString registrationData;
DOMString clientData;
};
Ces données contiennent plusieurs éléments avec lesquels votre application doit travailler.
J'ai préparé un ébauche d'implémentation approximative pour le serveur de la partie de confiance en Java qui montre comment extraire et valider ces informations récemment.
Une fois l'enregistrement terminé et que vous avez en quelque sorte stocké les détails de la clé générée, vous pouvez signer les demandes.
Comme vous l'avez dit, cela peut être initié rapidement et simplement via l'API JavaScript de haut niveau:
window.u2f.sign([{
version : "U2F_V2",
challenge : "c3RpbGwgYm9yZWQ/IQ",
app_id : "http://example.org",
sessionId : "42",
keyHandle: "ZHVtbXlfa2V5X2hhbmRsZQ"
}], function (data) {
});
Ici, vous devez fournir le handle de clé, que vous avez obtenu lors de l'inscription. Encore une fois, après que l'utilisateur a effectué un "test de présence utilisateur" (par exemple en touchant le jeton), vous recevrez une réponse, qui est un objet JSON (encore une fois, voir les spécifications pour plus de détails)
dictionary SignResponse {
DOMString keyHandle;
DOMString signatureData;
DOMString clientData;
};
Vous avez besoin de valider les données de signature contenues dans ce document.
Une fois ces validations effectuées, vous pouvez considérer l'utilisateur comme authentifié. Un bref exemple d'implémentation du code côté serveur pour cela est également contenu dans mon exemple de serveur .
J'ai récemment écrit des instructions pour cela, ainsi que répertoriant toutes les bibliothèques de serveurs U2F (la plupart d'entre elles regroupe un serveur de démonstration pleinement fonctionnel), à développeurs .yubico.com/U2F. L'objectif est de permettre aux développeurs d'implémenter/intégrer U2F sans avoir à lire les spécifications.
Avertissement: je travaille en tant que développeur chez Yubico.