Ce
Que contient ce JRD ? Ce qu'on veut. Pas grand'chose si on est
soucieux de
(Pour des raisons
historiques, certaines mises en œuvre de WebFinger distribuent un XRD,
la même chose mais en
Et quel genre d'
WebFinger reste délibérement ouvert : le RFC spécifie un protocole
et un format mais pas une sémantique. Ainsi, le JRD peut avoir un
contenu très varié selon les applications. L'idée est que chaque
application de WebFinger spécialisera ce protocole et ce format, en
indiquant plus précisément le type d'URI attendu et les informations
contenues dans le JRD de réponse. À noter que ce point avait fait
l'objet de vives controverses à l'
La section 3 donne deux exemples d'utilisation, le premier
dans le cas d'OpenID
Connect et le second pour récupérer des métadonnées sur une
page Web. Dans le premier cas, Carol veut s'authentifier auprès d'un
site Web et donne son identificateur OpenID
Connect,
À noter que les versions préliminaires de ce RFC avaient également
plein d'exemples très hypothétiques, jamais utilisés en vrai, et qui
ont été ensuite supprimés. On y trouvait par exemple un mécanisme
possible pour l'autoconfiguration du client de courrier électronique,
qui n'apportait rien par rapport au
Avant de se plonger dans le protocole lui-même, la section 2
rappelle quelques points de vocabulaire. WebFinger étant, comme son
nom l'indique, fondé sur le
"links" : [
{
"rel" : "copyright",
"href" : "http://www.example.com/copyright"
},
{
"rel" : "author",
"href" : "http://blog.example.com/author/steve",
}
]
Cet exemple se lit : l'entité interrogée via WebFinger a un
La section 4 décrit le protocole complet. C'est du
GET /.well-known/webfinger?resource=http%3A%2F%2Fblog.example.com%2Farticle%2Fid%2F314 HTTP/1.1
Host: blog.example.com
Le composant de requête (section 3.4 du
Si le serveur WebFinger connait l'entité en question, et accepte de
répondre, il répond par
le JRD (les données en JSON, étiquetées
Et si le client a inclus un ou plusieurs
GET /.well-known/webfinger?resource=http%3A%2F%2Fblog.example.com%2Farticle%2Fid%2F314&rel=author HTTP/1.1
Host: blog.example.com
...
"links" : [
{
"rel" : "author",
"href" : "http://blog.example.com/author/steve",
}
]
Quel est l'intérêt (après tout, le client pourrait ainsi bien filtrer
les types de liens après les avoir tous récupérés) ? Économiser des
ressources sur le serveur (certaines informations peuvent nécessiter
des requêtes compliquées dans une base de données) et diminuer le
débit réseau. Notez toutefois, si vous écrivez un client, que tous les
serveurs ne gèrent pas ce paramètre
Le format complet du JRD (
{
"subject" : "http://blog.example.com/article/id/314",
"aliases" :
[
"http://blog.example.com/cool_new_thing",
"http://blog.example.com/steve/article/7"
],
"properties" :
{
"http://blgx.example.net/ns/version" : "1.3",
"http://blgx.example.net/ns/ext" : null
},
"links" :
[
{
"rel" : "copyright",
"href" : "http://www.example.com/copyright"
},
{
"rel" : "author",
"href" : "http://blog.example.com/author/steve",
"titles" :
{
"en" : "The Magical World of Steve",
"fr" : "Le Monde Magique de Steve"
},
"properties" :
{
"http://example.com/role" : "editor"
}
}
]
}
La section 7 du RFC couvre un cas délicat, celui de services
WebFinger hébergés. Si on souhaite sous-traiter WebFinger à un tiers,
comment l'indique-t-on ? La seule solution est de faire une
redirection HTTP depuis son site. Par exemple, avec
Redirect /.well-known/webfinger http://wf.example.net/.well-known/webfinger
Et les requêtes WebFinger qu'on recevra seront gérées par le
prestataire
La section 8 décrit ce que veut dire « spécifier l'usage de
WebFinger pour une application ». On a vu que WebFinger fournissait un
protocole et un format très général. Chaque application qui compte se
servir de WebFinger doit préciser un certain nombre de choses,
notamment le contenu du JRD attendu. Si vous voulez vous servir de
WebFinger pour un nouveau service très cool, vous allez devoir lire
cette section et rédiger les détails. Première chose, le type d'URI
attendu (
Enfin, l'application doit spécifier le contenu attendu : quelles
Ce n'est pas un peu indiscret, toutes ces informations distribuées
à tout vent ? Si, et ce point a fait l'objet de vives discussions à
l'IETF, ce qui a fini par donner naissance aux sections 6 et 9.2 de ce
RFC. Le principal avantage de WebFinger (un seul endroit où aller pour
récupérer toutes les informations sur une entité, et sous une forme
structurée, ce qui est très pratique pour les programmes qui vont
l'analyser) est aussi son principal risque (comme dit le RFC «
Ces sections « vie privée » du RFC rappellent qu'un serveur WebFinger ne distribue que ce
qu'il veut. En cas de demande d'information sur une personne, par
exemple, la norme technique qu'est ce RFC ne spécifie pas qu'on doive
distribuer l'adresse et le numéro de téléphone. C'est un choix des
administrateurs du serveur. (Au passage, c'est exactement la même
chose pour le protocole
Ensuite, le serveur n'est pas obligé d'être
ouvert à tout le monde. Il peut parfaitement utiliser
l'authentification HTTP (ou d'autres mécanismes de contrôle d'accès
comme l'
La section 9.2 demande donc que, pour tout service WebFinger, il existe
une interface permettant aux utilisateurs d'indiquer de manière simple
s'ils veulent que des informations à leur sujet soient publiées ou
pas, et lesquelles. Par exemple, pour un
Les liens fournis en réponse à une requête WebFinger peuvent d'ailleurs eux aussi pointer vers des ressources dont l'accès est contrôlé ou limité. Bref, ce n'est pas de la faute de WebFinger si des informations sensibles circulent, il n'est qu'un outil, à utiliser intelligemment.
Autre problème de sécurité avec WebFinger, le fait que la réponse
est différente selon que la ressource existe ou pas (code HTTP 200
dans le premier cas et 404 dans le second). Ainsi, même si la réponse
est vide, un client WebFinger peut, par essais répétés, se constituer
une liste des ressources existantes. Cela peut permettre d'énumérer
les utilisateurs d'un réseau social, ou bien les adresses de courrier
valides (information certainement utile pour un
Autre cas où l'utilisation maladroite de WebFinger peut avoir des
conséquences néfastes, les requêtes automatiques. Supposons un
Enfin, le RFC note que rien ne garantit que les valeurs renvoyées
par WebFinger soient correctes (là encore, c'est un problème que les
utilisateurs de
Question mises en œuvre, ce n'est pas cela qui manque, y compris en
Voici quelques exemples de requêtes WebFinger réelles, faites avec
le client REST
% curl -v 'https://packetizer.com/.well-known/webfinger?resource=acct:paulej@packetizer.com'
HTTP/1.1 200 OK
Server: Apache/2.2.22 (Fedora)
Access-Control-Allow-Origin: *
Content-Type: application/jrd+json; charset=UTF-8
...
{
"subject" : "acct:paulej@packetizer.com",
"aliases" :
[
"h323:paulej@packetizer.com"
],
"properties" :
{
"http://packetizer.com/ns/name" : "Paul E. Jones",
"http://packetizer.com/ns/name#zh-CN" : "保罗‧琼斯",
"http://packetizer.com/ns/activated" : "2000-02-17T03:00:00Z"
},
"links" :
[
{
"rel" : "test1",
"href" : "http://example.com/author?q=acct%3Apaulej%40packetizer.com",
"titles" :
{
"en-us" : "Test Link"
}
},
{
"rel" : "test2",
"href" : "http://example.org/%E7%A7%81%E3%81%AE%E6%96%87%E6%9B%B8.txt"
},
{
"rel" : "http://webfinger.net/rel/avatar",
"type" : "image/jpeg",
"href" : "http://www.packetizer.com/people/paulej/images/paulej.jpg"
},
{
"rel" : "http://specs.openid.net/auth/2.0/provider",
"href" : "https://openid.packetizer.com/paulej"
},
{
"rel" : "http://packetizer.com/rel/share",
"type" : "text/html",
"href" : "http://hive.packetizer.com/users/paulej/"
},
{
"rel" : "http://webfinger.net/rel/profile-page",
"type" : "text/html",
"href" : "http://www.packetizer.com/people/paulej/"
},
{
"rel" : "http://packetizer.com/rel/blog",
"type" : "text/html",
"href" : "http://www.packetizer.com/people/paulej/blog/",
"titles" :
{
"en-us" : "Paul E. Jones' Blog"
}
},
{
"rel" : "http://packetizer.com/rel/businesscard",
"type" : "text/vcard",
"href" : "http://www.packetizer.com/people/paulej/paulej.vcf"
},
{
"rel" : "http://schemas.google.com/g/2010#updates-from",
"type" : "application/atom+xml",
"href" : "http://www.packetizer.com/people/paulej/blog/blog.xml"
},
{
"rel" : "http://microformats.org/profile/hcard",
"type" : "text/html",
"href" : "http://www.packetizer.com/people/paulej/"
},
{
"rel" : "http://bitcoin.org/rel/address",
"href" : "bitcoin:17XoqvUCrf12H7Vc7c7uDxib8FDMXFx2p6"
}
]
}
Autre exemple, pour l'URI
% curl -v 'https://seed.gluu.org/.well-known/webfinger?resource=acct:javier@seed.gluu.org'
...
{
"subject": "acct:javier@seed.gluu.org",
"links": [{
"rel": "http://openid.net/specs/connect/1.0/issuer",
"href": "https://seed.gluu.org"
}]
}
En théorie, si on était sérieux, on ajouterait à curl l'option
WebFinger est également utilisé par
% curl 'https://mastodon.gougere.fr/.well-known/webfinger?resource=bortzmeyer@mastodon.gougere.fr'
{"subject":"acct:bortzmeyer@mastodon.gougere.fr","aliases":["https://mastodon.gougere.fr/@bortzmeyer"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://mastodon.gougere.fr/@bortzmeyer"},{"rel":"http://schemas.google.com/g/2010#updates-from","type":"application/atom+xml","href":"https://mastodon.gougere.fr/users/bortzmeyer.atom"},{"rel":"salmon","href":"https://mastodon.gougere.fr/api/salmon/369"},{"rel":"magic-public-key","href":"data:application/magic-public-key,RSA._AmUWXDlwOkzKtqUsxUC94_B9yRZct-C8QqrxLWhGzA3zKNZwic0KWKMBuVRuQ7GXOq5lsyhA2pvXBTnh-Sk_8G5uLY6I7C0sjgAQKyiHVCmOBAGwcw67qfxIoN5-l2NrIZ0IygxnMOY_GU1q6fg8v6_1_bepnjCduWRVAdDBoo_HzSn91LYVleAg3E3oK8eXWYb28_DaCq9tJy5hHYLDK92XKTtk7t0Ii9U7znFvSrqgqD-qEc3KQHS5kOFRD1EfK9CI6872og0M_b6FVhNfcITaVjjk3S0uM0mpHiQuqPtfytdkRlEBd4uZUce3dPk0sODQaNcVrAMHf0KFm3w1w==.AQAB"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://mastodon.gougere.fr/authorize_follow?acct={uri}"}]}
Enfin, pour terminer cet article, une question que se posent
certainement tous mes lecteurs qui connaissent le
Autres lectures sur WebFinger, la synthèse de l'auteur du RFC, et un argumentaire pro-WebFinger de sa part.