···11-(*---------------------------------------------------------------------------
22- Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
33- SPDX-License-Identifier: ISC
44- ---------------------------------------------------------------------------*)
55-66-(** RFC 7033 WebFinger: Protocol for discovering resource information.
77-88- This module implements the WebFinger protocol as specified in
99- {{:https://datatracker.ietf.org/doc/html/rfc7033}RFC 7033}, providing
1010- type-safe JSON Resource Descriptor (JRD) encoding/decoding and an
1111- HTTP client for WebFinger queries.
1212-1313- {2 References}
1414- {ul
1515- {- {{:https://datatracker.ietf.org/doc/html/rfc7033}RFC 7033} - WebFinger}
1616- {- {{:https://datatracker.ietf.org/doc/html/rfc6415}RFC 6415} - Web Host Metadata}} *)
1717-1818-let src = Logs.Src.create "webfinger" ~doc:"WebFinger Protocol"
1919-module Log = (val Logs.src_log src : Logs.LOG)
2020-2121-(** {1 Error Types} *)
2222-2323-type error =
2424- | Invalid_resource of string
2525- | Http_error of { status : int; body : string }
2626- | Json_error of string
2727- | Https_required
2828- | Not_found
2929-3030-let pp_error ppf = function
3131- | Invalid_resource s -> Format.fprintf ppf "Invalid resource: %s" s
3232- | Http_error { status; body } -> Format.fprintf ppf "HTTP error %d: %s" status body
3333- | Json_error s -> Format.fprintf ppf "JSON parse error: %s" s
3434- | Https_required -> Format.fprintf ppf "WebFinger requires HTTPS"
3535- | Not_found -> Format.fprintf ppf "Resource not found"
3636-3737-let error_to_string e = Format.asprintf "%a" pp_error e
3838-3939-exception Webfinger_error of error
4040-4141-let raise_error e = raise (Webfinger_error e)
4242-4343-(** {1 Internal JSON helpers} *)
4444-4545-module String_map = Map.Make(String)
4646-4747-let properties_jsont : (string * string option) list Jsont.t =
4848- let inner =
4949- Jsont.Object.map ~kind:"Properties" Fun.id
5050- |> Jsont.Object.keep_unknown (Jsont.Object.Mems.string_map (Jsont.option Jsont.string)) ~enc:Fun.id
5151- |> Jsont.Object.finish
5252- in
5353- Jsont.map
5454- ~dec:(fun m -> List.of_seq (String_map.to_seq m))
5555- ~enc:(fun l -> String_map.of_list l)
5656- inner
5757-5858-let titles_jsont : (string * string) list Jsont.t =
5959- let inner =
6060- Jsont.Object.map ~kind:"Titles" Fun.id
6161- |> Jsont.Object.keep_unknown (Jsont.Object.Mems.string_map Jsont.string) ~enc:Fun.id
6262- |> Jsont.Object.finish
6363- in
6464- Jsont.map
6565- ~dec:(fun m -> List.of_seq (String_map.to_seq m))
6666- ~enc:(fun l -> String_map.of_list l)
6767- inner
6868-6969-(** {1 Link Module} *)
7070-7171-module Link = struct
7272- type t = {
7373- rel : string;
7474- type_ : string option;
7575- href : string option;
7676- titles : (string * string) list;
7777- properties : (string * string option) list;
7878- }
7979-8080- let make ~rel ?type_ ?href ?(titles = []) ?(properties = []) () =
8181- { rel; type_; href; titles; properties }
8282-8383- let rel t = t.rel
8484- let type_ t = t.type_
8585- let href t = t.href
8686- let titles t = t.titles
8787- let properties t = t.properties
8888-8989- let title ?(lang = "und") t =
9090- match List.assoc_opt lang t.titles with
9191- | Some title -> Some title
9292- | None -> List.assoc_opt "und" t.titles
9393-9494- let property ~uri t = List.assoc_opt uri t.properties |> Option.join
9595-9696- let jsont =
9797- let make rel type_ href titles properties =
9898- { rel; type_; href; titles; properties }
9999- in
100100- Jsont.Object.map ~kind:"Link" make
101101- |> Jsont.Object.mem "rel" Jsont.string ~enc:(fun (l : t) -> l.rel)
102102- |> Jsont.Object.opt_mem "type" Jsont.string ~enc:(fun (l : t) -> l.type_)
103103- |> Jsont.Object.opt_mem "href" Jsont.string ~enc:(fun (l : t) -> l.href)
104104- |> Jsont.Object.mem "titles" titles_jsont ~dec_absent:[] ~enc_omit:(fun x -> x = []) ~enc:(fun (l : t) -> l.titles)
105105- |> Jsont.Object.mem "properties" properties_jsont ~dec_absent:[] ~enc_omit:(fun x -> x = []) ~enc:(fun (l : t) -> l.properties)
106106- |> Jsont.Object.skip_unknown
107107- |> Jsont.Object.finish
108108-109109- let pp ppf t =
110110- Format.fprintf ppf "@[<v 2>Link:@,rel: %s@," t.rel;
111111- Option.iter (Format.fprintf ppf "type: %s@,") t.type_;
112112- Option.iter (Format.fprintf ppf "href: %s@,") t.href;
113113- if t.titles <> [] then begin
114114- Format.fprintf ppf "titles:@,";
115115- List.iter (fun (lang, title) -> Format.fprintf ppf " %s: %s@," lang title) t.titles
116116- end;
117117- if t.properties <> [] then begin
118118- Format.fprintf ppf "properties:@,";
119119- List.iter (fun (uri, value) ->
120120- match value with
121121- | Some v -> Format.fprintf ppf " %s: %s@," uri v
122122- | None -> Format.fprintf ppf " %s: null@," uri
123123- ) t.properties
124124- end;
125125- Format.fprintf ppf "@]"
126126-end
127127-128128-(** {1 JRD Module} *)
129129-130130-module Jrd = struct
131131- type t = {
132132- subject : string option;
133133- aliases : string list;
134134- properties : (string * string option) list;
135135- links : Link.t list;
136136- }
137137-138138- let make ?subject ?(aliases = []) ?(properties = []) ?(links = []) () =
139139- { subject; aliases; properties; links }
140140-141141- let subject t = t.subject
142142- let aliases t = t.aliases
143143- let properties t = t.properties
144144- let links t = t.links
145145-146146- let find_link ~rel t = List.find_opt (fun l -> Link.rel l = rel) t.links
147147- let find_links ~rel t = List.filter (fun l -> Link.rel l = rel) t.links
148148- let property ~uri t = List.assoc_opt uri t.properties |> Option.join
149149-150150- let jsont =
151151- let make subject aliases properties links =
152152- { subject; aliases; properties; links }
153153- in
154154- Jsont.Object.map ~kind:"JRD" make
155155- |> Jsont.Object.opt_mem "subject" Jsont.string ~enc:(fun (j : t) -> j.subject)
156156- |> Jsont.Object.mem "aliases" (Jsont.list Jsont.string) ~dec_absent:[] ~enc_omit:(fun x -> x = []) ~enc:(fun (j : t) -> j.aliases)
157157- |> Jsont.Object.mem "properties" properties_jsont ~dec_absent:[] ~enc_omit:(fun x -> x = []) ~enc:(fun (j : t) -> j.properties)
158158- |> Jsont.Object.mem "links" (Jsont.list Link.jsont) ~dec_absent:[] ~enc_omit:(fun x -> x = []) ~enc:(fun (j : t) -> j.links)
159159- |> Jsont.Object.skip_unknown
160160- |> Jsont.Object.finish
161161-162162- let of_string s =
163163- match Jsont_bytesrw.decode_string jsont s with
164164- | Ok jrd -> Ok jrd
165165- | Error e -> Error (Json_error e)
166166-167167- let to_string t =
168168- match Jsont_bytesrw.encode_string jsont t with
169169- | Ok s -> s
170170- | Error e -> failwith ("JSON encoding error: " ^ e)
171171-172172- let pp ppf t =
173173- Format.fprintf ppf "@[<v>";
174174- Option.iter (Format.fprintf ppf "subject: %s@,") t.subject;
175175- if t.aliases <> [] then begin
176176- Format.fprintf ppf "aliases:@,";
177177- List.iter (Format.fprintf ppf " - %s@,") t.aliases
178178- end;
179179- if t.properties <> [] then begin
180180- Format.fprintf ppf "properties:@,";
181181- List.iter (fun (uri, value) ->
182182- match value with
183183- | Some v -> Format.fprintf ppf " %s: %s@," uri v
184184- | None -> Format.fprintf ppf " %s: null@," uri
185185- ) t.properties
186186- end;
187187- if t.links <> [] then begin
188188- Format.fprintf ppf "links:@,";
189189- List.iter (fun link -> Format.fprintf ppf " %a@," Link.pp link) t.links
190190- end;
191191- Format.fprintf ppf "@]"
192192-end
193193-194194-(** {1 Common Link Relations} *)
195195-196196-module Rel = struct
197197- let activitypub = "self"
198198- let openid = "http://openid.net/specs/connect/1.0/issuer"
199199- let profile = "http://webfinger.net/rel/profile-page"
200200- let avatar = "http://webfinger.net/rel/avatar"
201201- let feed = "http://schemas.google.com/g/2010#updates-from"
202202- let portable_contacts = "http://portablecontacts.net/spec/1.0"
203203- let oauth_authorization = "http://tools.ietf.org/html/rfc6749#section-3.1"
204204- let oauth_token = "http://tools.ietf.org/html/rfc6749#section-3.2"
205205- let subscribe = "http://ostatus.org/schema/1.0/subscribe"
206206- let salmon = "salmon"
207207- let magic_key = "magic-public-key"
208208-end
209209-210210-(** {1 URL Construction} *)
211211-212212-let webfinger_url ~resource ?(rels = []) host =
213213- let base = Printf.sprintf "https://%s/.well-known/webfinger" host in
214214- let uri = Uri.of_string base in
215215- let uri = Uri.add_query_param' uri ("resource", resource) in
216216- let uri = List.fold_left (fun u rel -> Uri.add_query_param' u ("rel", rel)) uri rels in
217217- Uri.to_string uri
218218-219219-let host_of_resource resource =
220220- if String.length resource > 5 && String.sub resource 0 5 = "acct:" then begin
221221- match String.index_opt resource '@' with
222222- | Some idx ->
223223- let host_part = String.sub resource (idx + 1) (String.length resource - idx - 1) in
224224- Ok host_part
225225- | None -> Error (Invalid_resource "acct: URI must contain @")
226226- end else begin
227227- let uri = Uri.of_string resource in
228228- match Uri.host uri with
229229- | Some host -> Ok host
230230- | None -> Error (Invalid_resource "Cannot determine host from resource URI")
231231- end
232232-233233-(** {1 HTTP Client} *)
234234-235235-let query session ~resource ?(rels = []) () =
236236- match host_of_resource resource with
237237- | Error e -> Error e
238238- | Ok host ->
239239- let url = webfinger_url ~resource ~rels host in
240240- Log.info (fun m -> m "WebFinger query: %s" url);
241241- let headers = Requests.Headers.empty |> Requests.Headers.set `Accept "application/jrd+json" in
242242- let response = Requests.get session ~headers url in
243243- let status = Requests.Response.status_code response in
244244- let body = Eio.Flow.read_all (Requests.Response.body response) in
245245- if status = 404 then Error Not_found
246246- else if status >= 400 then Error (Http_error { status; body })
247247- else Jrd.of_string body
248248-249249-let query_exn session ~resource ?rels () =
250250- match query session ~resource ?rels () with
251251- | Ok jrd -> jrd
252252- | Error e -> raise_error e
-220
ocaml-webfinger/lib/webfinger.mli
···11-(*---------------------------------------------------------------------------
22- Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
33- SPDX-License-Identifier: ISC
44- ---------------------------------------------------------------------------*)
55-66-(** RFC 7033 WebFinger: Protocol for discovering resource information.
77-88- This module implements the WebFinger protocol as specified in
99- {{:https://datatracker.ietf.org/doc/html/rfc7033}RFC 7033}, providing
1010- type-safe JSON Resource Descriptor (JRD) encoding/decoding and an
1111- HTTP client for WebFinger queries.
1212-1313- {2 Example}
1414- {[
1515- Eio_main.run @@ fun env ->
1616- Eio.Switch.run @@ fun sw ->
1717- let session = Requests.create ~sw env in
1818- match Webfinger.query session ~resource:"acct:user@example.com" () with
1919- | Ok jrd ->
2020- Format.printf "%a@." Webfinger.Jrd.pp jrd;
2121- begin match Webfinger.Jrd.find_link ~rel:"self" jrd with
2222- | Some link -> Format.printf "ActivityPub: %s@." (Option.get (Webfinger.Link.href link))
2323- | None -> ()
2424- end
2525- | Error e ->
2626- Format.eprintf "Error: %a@." Webfinger.pp_error e
2727- ]}
2828-2929- {2 References}
3030- {ul
3131- {- {{:https://datatracker.ietf.org/doc/html/rfc7033}RFC 7033} - WebFinger}
3232- {- {{:https://datatracker.ietf.org/doc/html/rfc6415}RFC 6415} - Web Host Metadata}} *)
3333-3434-(** {1 Error Types} *)
3535-3636-type error =
3737- | Invalid_resource of string
3838- (** The resource parameter is missing or malformed. *)
3939- | Http_error of { status : int; body : string }
4040- (** HTTP request failed with the given status code. *)
4141- | Json_error of string
4242- (** Failed to parse JRD JSON response. *)
4343- | Https_required
4444- (** WebFinger requires HTTPS but HTTP was requested. *)
4545- | Not_found
4646- (** The server has no information about the requested resource. *)
4747-4848-val pp_error : Format.formatter -> error -> unit
4949-(** [pp_error fmt e] pretty-prints an error. *)
5050-5151-val error_to_string : error -> string
5252-(** [error_to_string e] converts an error to a human-readable string. *)
5353-5454-exception Webfinger_error of error
5555-(** Exception raised by [*_exn] functions. *)
5656-5757-(** {1 Link}
5858-5959- Link relation object as specified in
6060- {{:https://datatracker.ietf.org/doc/html/rfc7033#section-4.4.4}RFC 7033 Section 4.4.4}. *)
6161-6262-module Link : sig
6363- type t
6464- (** A link relation in a JRD. *)
6565-6666- val make :
6767- rel:string ->
6868- ?type_:string ->
6969- ?href:string ->
7070- ?titles:(string * string) list ->
7171- ?properties:(string * string option) list ->
7272- unit -> t
7373- (** [make ~rel ?type_ ?href ?titles ?properties ()] creates a link. *)
7474-7575- val rel : t -> string
7676- (** [rel link] returns the link relation type. *)
7777-7878- val type_ : t -> string option
7979- (** [type_ link] returns the media type. *)
8080-8181- val href : t -> string option
8282- (** [href link] returns the target URI. *)
8383-8484- val titles : t -> (string * string) list
8585- (** [titles link] returns all title/language pairs. *)
8686-8787- val properties : t -> (string * string option) list
8888- (** [properties link] returns all link properties. *)
8989-9090- val title : ?lang:string -> t -> string option
9191- (** [title ?lang link] returns the title for [lang] (default "und"). *)
9292-9393- val property : uri:string -> t -> string option
9494- (** [property ~uri link] returns the property value for [uri]. *)
9595-9696- val jsont : t Jsont.t
9797- (** JSON type descriptor for links. *)
9898-9999- val pp : Format.formatter -> t -> unit
100100- (** [pp fmt link] pretty-prints a link. *)
101101-end
102102-103103-(** {1 JRD}
104104-105105- JSON Resource Descriptor as specified in
106106- {{:https://datatracker.ietf.org/doc/html/rfc7033#section-4.4}RFC 7033 Section 4.4}. *)
107107-108108-module Jrd : sig
109109- type t
110110- (** A JSON Resource Descriptor. *)
111111-112112- val make :
113113- ?subject:string ->
114114- ?aliases:string list ->
115115- ?properties:(string * string option) list ->
116116- ?links:Link.t list ->
117117- unit -> t
118118- (** [make ?subject ?aliases ?properties ?links ()] creates a JRD. *)
119119-120120- val subject : t -> string option
121121- (** [subject jrd] returns the subject URI. *)
122122-123123- val aliases : t -> string list
124124- (** [aliases jrd] returns the list of alias URIs. *)
125125-126126- val properties : t -> (string * string option) list
127127- (** [properties jrd] returns subject properties. *)
128128-129129- val links : t -> Link.t list
130130- (** [links jrd] returns all links. *)
131131-132132- val find_link : rel:string -> t -> Link.t option
133133- (** [find_link ~rel jrd] returns the first link with relation [rel]. *)
134134-135135- val find_links : rel:string -> t -> Link.t list
136136- (** [find_links ~rel jrd] returns all links with relation [rel]. *)
137137-138138- val property : uri:string -> t -> string option
139139- (** [property ~uri jrd] returns the property value for [uri]. *)
140140-141141- val jsont : t Jsont.t
142142- (** JSON type descriptor for JRD. *)
143143-144144- val of_string : string -> (t, error) result
145145- (** [of_string s] parses a JRD from JSON. *)
146146-147147- val to_string : t -> string
148148- (** [to_string jrd] serializes a JRD to JSON. *)
149149-150150- val pp : Format.formatter -> t -> unit
151151- (** [pp fmt jrd] pretty-prints a JRD. *)
152152-end
153153-154154-(** {1 Common Link Relations} *)
155155-156156-module Rel : sig
157157- val activitypub : string
158158- (** ["self"] - ActivityPub actor profile. *)
159159-160160- val openid : string
161161- (** OpenID Connect issuer. *)
162162-163163- val profile : string
164164- (** Profile page. *)
165165-166166- val avatar : string
167167- (** Avatar image. *)
168168-169169- val feed : string
170170- (** Atom/RSS feed. *)
171171-172172- val portable_contacts : string
173173- (** Portable Contacts. *)
174174-175175- val oauth_authorization : string
176176- (** OAuth 2.0 authorization endpoint. *)
177177-178178- val oauth_token : string
179179- (** OAuth 2.0 token endpoint. *)
180180-181181- val subscribe : string
182182- (** Subscribe to resource (OStatus). *)
183183-184184- val salmon : string
185185- (** Salmon endpoint (legacy). *)
186186-187187- val magic_key : string
188188- (** Magic public key (legacy). *)
189189-end
190190-191191-(** {1 URL Construction} *)
192192-193193-val webfinger_url : resource:string -> ?rels:string list -> string -> string
194194-(** [webfinger_url ~resource ?rels host] constructs the WebFinger query URL. *)
195195-196196-val host_of_resource : string -> (string, error) result
197197-(** [host_of_resource resource] extracts the host from an acct: or https: URI. *)
198198-199199-(** {1 HTTP Client} *)
200200-201201-val query :
202202- Requests.t ->
203203- resource:string ->
204204- ?rels:string list ->
205205- unit -> (Jrd.t, error) result
206206-(** [query session ~resource ?rels ()] performs a WebFinger query.
207207-208208- Per {{:https://datatracker.ietf.org/doc/html/rfc7033#section-4}RFC 7033 Section 4}:
209209- - Queries use HTTPS
210210- - The Accept header requests application/jrd+json
211211- - 200 OK returns a JRD
212212- - 404 means no information available *)
213213-214214-val query_exn :
215215- Requests.t ->
216216- resource:string ->
217217- ?rels:string list ->
218218- unit -> Jrd.t
219219-(** [query_exn session ~resource ?rels ()] is like {!query} but raises
220220- {!Webfinger_error} on failure. *)
-1571
ocaml-webfinger/spec/rfc7033.txt
···11-22-33-44-55-66-77-Internet Engineering Task Force (IETF) P. Jones
88-Request for Comments: 7033 G. Salgueiro
99-Category: Standards Track Cisco Systems
1010-ISSN: 2070-1721 M. Jones
1111- Microsoft
1212- J. Smarr
1313- Google
1414- September 2013
1515-1616-1717- WebFinger
1818-1919-Abstract
2020-2121- This specification defines the WebFinger protocol, which can be used
2222- to discover information about people or other entities on the
2323- Internet using standard HTTP methods. WebFinger discovers
2424- information for a URI that might not be usable as a locator
2525- otherwise, such as account or email URIs.
2626-2727-Status of This Memo
2828-2929- This is an Internet Standards Track document.
3030-3131- This document is a product of the Internet Engineering Task Force
3232- (IETF). It represents the consensus of the IETF community. It has
3333- received public review and has been approved for publication by the
3434- Internet Engineering Steering Group (IESG). Further information on
3535- Internet Standards is available in Section 2 of RFC 5741.
3636-3737- Information about the current status of this document, any errata,
3838- and how to provide feedback on it may be obtained at
3939- http://www.rfc-editor.org/info/rfc7033.
4040-4141-Copyright Notice
4242-4343- Copyright (c) 2013 IETF Trust and the persons identified as the
4444- document authors. All rights reserved.
4545-4646- This document is subject to BCP 78 and the IETF Trust's Legal
4747- Provisions Relating to IETF Documents
4848- (http://trustee.ietf.org/license-info) in effect on the date of
4949- publication of this document. Please review these documents
5050- carefully, as they describe your rights and restrictions with respect
5151- to this document. Code Components extracted from this document must
5252- include Simplified BSD License text as described in Section 4.e of
5353- the Trust Legal Provisions and are provided without warranty as
5454- described in the Simplified BSD License.
5555-5656-5757-5858-Jones, et al. Standards Track [Page 1]
5959-6060-RFC 7033 WebFinger September 2013
6161-6262-6363-Table of Contents
6464-6565- 1. Introduction ....................................................3
6666- 2. Terminology .....................................................3
6767- 3. Example Uses of WebFinger .......................................4
6868- 3.1. Identity Provider Discovery for OpenID Connect .............4
6969- 3.2. Getting Author and Copyright Information for a Web Page ....5
7070- 4. WebFinger Protocol ..............................................7
7171- 4.1. Constructing the Query Component of the Request URI.......7
7272- 4.2. Performing a WebFinger Query..............................8
7373- 4.3. The "rel" Parameter.......................................9
7474- 4.4. The JSON Resource Descriptor (JRD).......................11
7575- 4.4.1. subject.............................................11
7676- 4.4.2. aliases.............................................11
7777- 4.4.3. properties..........................................12
7878- 4.4.4. links...............................................12
7979- 4.5. WebFinger and URIs.......................................14
8080- 5. Cross-Origin Resource Sharing (CORS) ...........................14
8181- 6. Access Control .................................................15
8282- 7. Hosted WebFinger Services ......................................15
8383- 8. Definition of WebFinger Applications ...........................16
8484- 8.1. Specification of the URI Scheme and URI ...................17
8585- 8.2. Host Resolution ...........................................17
8686- 8.3. Specification of Properties ...............................17
8787- 8.4. Specification of Links ....................................18
8888- 8.5. One URI, Multiple Applications ............................18
8989- 8.6. Registration of Link Relation Types and Properties ........19
9090- 9. Security Considerations ........................................19
9191- 9.1. Transport-Related Issues ..................................19
9292- 9.2. User Privacy Considerations ...............................19
9393- 9.3. Abuse Potential ...........................................21
9494- 9.4. Information Reliability ...................................21
9595- 10. IANA Considerations ...........................................22
9696- 10.1. Well-Known URI ...........................................22
9797- 10.2. JSON Resource Descriptor (JRD) Media Type ................22
9898- 10.3. Registering Link Relation Types ..........................24
9999- 10.4. Establishment of the "WebFinger Properties" Registry .....24
100100- 10.4.1. The Registration Template .........................24
101101- 10.4.2. The Registration Procedures .......................25
102102- 11. Acknowledgments ...............................................26
103103- 12. References ....................................................26
104104- 12.1. Normative References .....................................26
105105- 12.2. Informative References ...................................27
106106-107107-108108-109109-110110-111111-112112-113113-114114-Jones, et al. Standards Track [Page 2]
115115-116116-RFC 7033 WebFinger September 2013
117117-118118-119119-1. Introduction
120120-121121- WebFinger is used to discover information about people or other
122122- entities on the Internet that are identified by a URI [6] using
123123- standard Hypertext Transfer Protocol (HTTP) [2] methods over a secure
124124- transport [12]. A WebFinger resource returns a JavaScript Object
125125- Notation (JSON) [5] object describing the entity that is queried.
126126- The JSON object is referred to as the JSON Resource Descriptor (JRD).
127127-128128- For a person, the type of information that might be discoverable via
129129- WebFinger includes a personal profile address, identity service,
130130- telephone number, or preferred avatar. For other entities on the
131131- Internet, a WebFinger resource might return JRDs containing link
132132- relations [8] that enable a client to discover, for example, that a
133133- printer can print in color on A4 paper, the physical location of a
134134- server, or other static information.
135135-136136- Information returned via WebFinger might be for direct human
137137- consumption (e.g., looking up someone's phone number), or it might be
138138- used by systems to help carry out some operation (e.g., facilitating,
139139- with additional security mechanisms, logging into a web site by
140140- determining a user's identity service). The information is intended
141141- to be static in nature, and, as such, WebFinger is not intended to be
142142- used to return dynamic information like the temperature of a CPU or
143143- the current toner level in a laser printer.
144144-145145- The WebFinger protocol is designed to be used across many
146146- applications. Applications that wish to utilize WebFinger will need
147147- to specify properties, titles, and link relation types that are
148148- appropriate for the application. Further, applications will need to
149149- define the appropriate URI scheme to utilize for the query target.
150150-151151- Use of WebFinger is illustrated in the examples in Section 3 and
152152- described more formally in Section 4. Section 8 describes how
153153- applications of WebFinger may be defined.
154154-155155-2. Terminology
156156-157157- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
158158- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
159159- document are to be interpreted as described in RFC 2119 [1].
160160-161161- WebFinger makes heavy use of "link relations". A link relation is an
162162- attribute-value pair in which the attribute identifies the type of
163163- relationship between the linked entity or resource and the
164164- information specified in the value. In Web Linking [4], the link
165165- relation is represented using an HTTP entity-header of "Link", where
166166- the "rel" attribute specifies the type of relationship and the "href"
167167-168168-169169-170170-Jones, et al. Standards Track [Page 3]
171171-172172-RFC 7033 WebFinger September 2013
173173-174174-175175- attribute specifies the information that is linked to the entity or
176176- resource. In WebFinger, the same concept is represented using a JSON
177177- array of "links" objects, where each member named "rel" specifies the
178178- type of relationship and each member named "href" specifies the
179179- information that is linked to the entity or resource. Note that
180180- WebFinger narrows the scope of a link relation beyond what is defined
181181- for Web Linking by stipulating that the value of the "rel" member
182182- needs to be either a single IANA-registered link relation type [8] or
183183- a URI [6].
184184-185185- The use of URIs throughout this document refers to URIs following the
186186- syntax specified in Section 3 of RFC 3986 [6]. Relative URIs, having
187187- syntax following that of Section 4.2 of RFC 3986, are not used with
188188- WebFinger.
189189-190190-3. Example Uses of WebFinger
191191-192192- This section shows a few sample uses of WebFinger. Any application
193193- of WebFinger would be specified outside of this document, as
194194- described in Section 8. The examples in this section should be
195195- simple enough to understand without having seen the formal
196196- specifications of the applications.
197197-198198-3.1. Identity Provider Discovery for OpenID Connect
199199-200200- Suppose Carol wishes to authenticate with a web site she visits using
201201- OpenID Connect [15]. She would provide the web site with her OpenID
202202- Connect identifier, say carol@example.com. The visited web site
203203- would perform a WebFinger query looking for the OpenID Connect
204204- provider. Since the site is interested in only one particular link
205205- relation, the WebFinger resource might utilize the "rel" parameter as
206206- described in Section 4.3:
207207-208208- GET /.well-known/webfinger?
209209- resource=acct%3Acarol%40example.com&
210210- rel=http%3A%2F%2Fopenid.net%2Fspecs%2Fconnect%2F1.0%2Fissuer
211211- HTTP/1.1
212212- Host: example.com
213213-214214-215215-216216-217217-218218-219219-220220-221221-222222-223223-224224-225225-226226-Jones, et al. Standards Track [Page 4]
227227-228228-RFC 7033 WebFinger September 2013
229229-230230-231231- The server might respond like this:
232232-233233- HTTP/1.1 200 OK
234234- Access-Control-Allow-Origin: *
235235- Content-Type: application/jrd+json
236236-237237- {
238238- "subject" : "acct:carol@example.com",
239239- "links" :
240240- [
241241- {
242242- "rel" : "http://openid.net/specs/connect/1.0/issuer",
243243- "href" : "https://openid.example.com"
244244- }
245245- ]
246246- }
247247-248248- Since the "rel" parameter only serves to filter the link relations
249249- returned by the resource, other name/value pairs in the response,
250250- including any aliases or properties, would be returned. Also, since
251251- support for the "rel" parameter is not guaranteed, the client must
252252- not assume the "links" array will contain only the requested link
253253- relation.
254254-255255-3.2. Getting Author and Copyright Information for a Web Page
256256-257257- Suppose an application is defined to retrieve metadata information
258258- about a web page URL, such as author and copyright information. To
259259- retrieve that information, the client can utilize WebFinger to issue
260260- a query for the specific URL. Suppose the URL of interest is
261261- http://blog.example.com/article/id/314. The client would issue a
262262- query similar to the following:
263263-264264- GET /.well-known/webfinger?
265265- resource=http%3A%2F%2Fblog.example.com%2Farticle%2Fid%2F314
266266- HTTP/1.1
267267- Host: blog.example.com
268268-269269-270270-271271-272272-273273-274274-275275-276276-277277-278278-279279-280280-281281-282282-Jones, et al. Standards Track [Page 5]
283283-284284-RFC 7033 WebFinger September 2013
285285-286286-287287- The server might then reply in this way:
288288-289289- HTTP/1.1 200 OK
290290- Access-Control-Allow-Origin: *
291291- Content-Type: application/jrd+json
292292-293293- {
294294- "subject" : "http://blog.example.com/article/id/314",
295295- "aliases" :
296296- [
297297- "http://blog.example.com/cool_new_thing",
298298- "http://blog.example.com/steve/article/7"
299299- ],
300300- "properties" :
301301- {
302302- "http://blgx.example.net/ns/version" : "1.3",
303303- "http://blgx.example.net/ns/ext" : null
304304- },
305305- "links" :
306306- [
307307- {
308308- "rel" : "copyright",
309309- "href" : "http://www.example.com/copyright"
310310- },
311311- {
312312- "rel" : "author",
313313- "href" : "http://blog.example.com/author/steve",
314314- "titles" :
315315- {
316316- "en-us" : "The Magical World of Steve",
317317- "fr" : "Le Monde Magique de Steve"
318318- },
319319- "properties" :
320320- {
321321- "http://example.com/role" : "editor"
322322- }
323323- }
324324-325325- ]
326326- }
327327-328328- In the above example, we see that the server returned a list of
329329- aliases, properties, and links related to the subject URL. The links
330330- contain references to information for each link relation type. For
331331- the author link, the server provided a reference to the author's
332332- blog, along with a title for the blog in two languages. The server
333333- also returned a single property related to the author, indicating the
334334- author's role as editor of the blog.
335335-336336-337337-338338-Jones, et al. Standards Track [Page 6]
339339-340340-RFC 7033 WebFinger September 2013
341341-342342-343343- It is worth noting that, while the server returned just two links in
344344- the "links" array in this example, a server might return any number
345345- of links when queried.
346346-347347-4. WebFinger Protocol
348348-349349- The WebFinger protocol is used to request information about an entity
350350- identified by a query target (a URI). The client can optionally
351351- specify one or more link relation types for which it would like to
352352- receive information.
353353-354354- A WebFinger request is an HTTPS request to a WebFinger resource. A
355355- WebFinger resource is a well-known URI [3] using the HTTPS scheme
356356- constructed along with the required query target and optional link
357357- relation types. WebFinger resources MUST NOT be served with any
358358- other URI scheme (such as HTTP).
359359-360360- A WebFinger resource is always given a query target, which is another
361361- URI that identifies the entity whose information is sought. GET
362362- requests to a WebFinger resource convey the query target in the
363363- "resource" parameter of the WebFinger URI's query string; see Section
364364- 4.1 for details.
365365-366366- The host to which a WebFinger query is issued is significant. If the
367367- query target contains a "host" portion (Section 3.2.2 of RFC 3986),
368368- then the host to which the WebFinger query is issued SHOULD be the
369369- same as the "host" portion of the query target, unless the client
370370- receives instructions through some out-of-band mechanism to send the
371371- query to another host. If the query target does not contain a "host"
372372- portion, then the client chooses a host to which it directs the query
373373- using additional information it has.
374374-375375- The path component of a WebFinger URI MUST be the well-known path
376376- "/.well-known/webfinger". A WebFinger URI MUST contain a query
377377- component that encodes the query target and optional link relation
378378- types as specified in Section 4.1.
379379-380380- The WebFinger resource returns a JSON Resource Descriptor (JRD) as
381381- the resource representation to convey information about an entity on
382382- the Internet. Also, the Cross-Origin Resource Sharing (CORS) [7]
383383- specification is utilized to facilitate queries made via a web
384384- browser.
385385-386386-4.1. Constructing the Query Component of the Request URI
387387-388388- A WebFinger URI MUST contain a query component (see Section 3.4 of
389389- RFC 3986). The query component MUST contain a "resource" parameter
390390- and MAY contain one or more "rel" parameters. The "resource"
391391-392392-393393-394394-Jones, et al. Standards Track [Page 7]
395395-396396-RFC 7033 WebFinger September 2013
397397-398398-399399- parameter MUST contain the query target (URI), and the "rel"
400400- parameters MUST contain encoded link relation types according to the
401401- encoding described in this section.
402402-403403- To construct the query component, the client performs the following
404404- steps. First, each parameter value is percent-encoded, as per
405405- Section 2.1 of RFC 3986. The encoding is done to conform to the
406406- query production in Section 3.4 of that specification, with the
407407- addition that any instances of the "=" and "&" characters within the
408408- parameter values are also percent-encoded. Next, the client
409409- constructs a string to be placed in the query component by
410410- concatenating the name of the first parameter together with an equal
411411- sign ("=") and the percent-encoded parameter value. For any
412412- subsequent parameters, the client appends an ampersand ("&") to the
413413- string, the name of the next parameter, an equal sign, and the
414414- parameter value. The client MUST NOT insert any spaces while
415415- constructing the string. The order in which the client places each
416416- attribute-value pair within the query component does not matter in
417417- the interpretation of the query component.
418418-419419-4.2. Performing a WebFinger Query
420420-421421- A WebFinger client issues a query using the GET method to the well-
422422- known [3] resource identified by the URI whose path component is
423423- "/.well-known/webfinger" and whose query component MUST include the
424424- "resource" parameter exactly once and set to the value of the URI for
425425- which information is being sought.
426426-427427- If the "resource" parameter is absent or malformed, the WebFinger
428428- resource MUST indicate that the request is bad as per Section 10.4.1
429429- of RFC 2616 [2].
430430-431431- If the "resource" parameter is a value for which the server has no
432432- information, the server MUST indicate that it was unable to match the
433433- request as per Section 10.4.5 of RFC 2616.
434434-435435- A client MUST query the WebFinger resource using HTTPS only. If the
436436- client determines that the resource has an invalid certificate, the
437437- resource returns a 4xx or 5xx status code, or if the HTTPS connection
438438- cannot be established for any reason, then the client MUST accept
439439- that the WebFinger query has failed and MUST NOT attempt to reissue
440440- the WebFinger request using HTTP over a non-secure connection.
441441-442442- A WebFinger resource MUST return a JRD as the representation for the
443443- resource if the client requests no other supported format explicitly
444444- via the HTTP "Accept" header. The client MAY include the "Accept"
445445- header to indicate a desired representation; representations other
446446- than JRD might be defined in future specifications. The WebFinger
447447-448448-449449-450450-Jones, et al. Standards Track [Page 8]
451451-452452-RFC 7033 WebFinger September 2013
453453-454454-455455- resource MUST silently ignore any requested representations that it
456456- does not understand or support. The media type used for the JSON
457457- Resource Descriptor (JRD) is "application/jrd+json" (see Section
458458- 10.2).
459459-460460- The properties, titles, and link relation types returned by the
461461- server in a JRD might be varied and numerous. For example, the
462462- server might return information about a person's blog, vCard [14],
463463- avatar, OpenID Connect provider, RSS or ATOM feed, and so forth in a
464464- reply. Likewise, if a server has no information to provide, it might
465465- return a JRD with an empty "links" array or no "links" array.
466466-467467- A WebFinger resource MAY redirect the client; if it does, the
468468- redirection MUST only be to an "https" URI and the client MUST
469469- perform certificate validation again when redirected.
470470-471471- A WebFinger resource can include cache validators in a response to
472472- enable conditional requests by the client and/or expiration times as
473473- per Section 13 of RFC 2616.
474474-475475-4.3. The "rel" Parameter
476476-477477- When issuing a request to a WebFinger resource, the client MAY
478478- utilize the "rel" parameter to request only a subset of the
479479- information that would otherwise be returned without the "rel"
480480- parameter. When the "rel" parameter is used and accepted, only the
481481- link relation types that match the link relation type provided via
482482- the "rel" parameter are included in the array of links returned in
483483- the JRD. If there are no matching link relation types defined for
484484- the resource, the "links" array in the JRD will be either absent or
485485- empty. All other information present in a resource descriptor
486486- remains present, even when "rel" is employed.
487487-488488- The "rel" parameter MAY be included multiple times in order to
489489- request multiple link relation types.
490490-491491- The purpose of the "rel" parameter is to return a subset of "link
492492- relation objects" (see Section 4.4.4) that would otherwise be
493493- returned in the resource descriptor. Use of the parameter might
494494- reduce processing requirements on either the client or server, and it
495495- might also reduce the bandwidth required to convey the partial
496496- resource descriptor, especially if there are numerous link relation
497497- values to convey for a given "resource" value. Note that if a client
498498- requests a particular link relation type for which the server has no
499499- information, the server MAY return a JRD with an empty "links" array
500500- or no "links" array.
501501-502502-503503-504504-505505-506506-Jones, et al. Standards Track [Page 9]
507507-508508-RFC 7033 WebFinger September 2013
509509-510510-511511- WebFinger resources SHOULD support the "rel" parameter. If the
512512- resource does not support the "rel" parameter, it MUST ignore the
513513- parameter and process the request as if no "rel" parameter values
514514- were present.
515515-516516- The following example uses the "rel" parameter to request links for
517517- two link relation types:
518518-519519- GET /.well-known/webfinger?
520520- resource=acct%3Abob%40example.com&
521521- rel=http%3A%2F%2Fwebfinger.example%2Frel%2Fprofile-page&
522522- rel=http%3A%2F%2Fwebfinger.example%2Frel%2Fbusinesscard HTTP/1.1
523523- Host: example.com
524524-525525- In this example, the client requests the link relations of type
526526- "http://webfinger.example/rel/profile-page" and
527527- "http://webfinger.example/rel/businesscard". The server then
528528- responds with a message like this:
529529-530530- HTTP/1.1 200 OK
531531- Access-Control-Allow-Origin: *
532532- Content-Type: application/jrd+json
533533-534534- {
535535- "subject" : "acct:bob@example.com",
536536- "aliases" :
537537- [
538538- "https://www.example.com/~bob/"
539539- ],
540540- "properties" :
541541- {
542542- "http://example.com/ns/role" : "employee"
543543- },
544544- "links" :
545545- [
546546- {
547547- "rel" : "http://webfinger.example/rel/profile-page",
548548- "href" : "https://www.example.com/~bob/"
549549- },
550550- {
551551- "rel" : "http://webfinger.example/rel/businesscard",
552552- "href" : "https://www.example.com/~bob/bob.vcf"
553553- }
554554- ]
555555- }
556556-557557-558558-559559-560560-561561-562562-Jones, et al. Standards Track [Page 10]
563563-564564-RFC 7033 WebFinger September 2013
565565-566566-567567- As you can see in the response, the resource representation contains
568568- only the links of the types requested by the client and for which the
569569- server had information, but the other parts of the JRD are still
570570- present. Note also in the above example that the links returned in
571571- the "links" array all use HTTPS, which is important if the data
572572- indirectly obtained via WebFinger needs to be returned securely.
573573-574574-4.4. The JSON Resource Descriptor (JRD)
575575-576576- The JSON Resource Descriptor (JRD), originally introduced in RFC 6415
577577- [16] and based on the Extensible Resource Descriptor (XRD) format
578578- [17], is a JSON object that comprises the following name/value pairs:
579579-580580- o subject
581581- o aliases
582582- o properties
583583- o links
584584-585585- The member "subject" is a name/value pair whose value is a string,
586586- "aliases" is an array of strings, "properties" is an object
587587- comprising name/value pairs whose values are strings, and "links" is
588588- an array of objects that contain link relation information.
589589-590590- When processing a JRD, the client MUST ignore any unknown member and
591591- not treat the presence of an unknown member as an error.
592592-593593- Below, each of these members of the JRD is described in more detail.
594594-595595-4.4.1. subject
596596-597597- The value of the "subject" member is a URI that identifies the entity
598598- that the JRD describes.
599599-600600- The "subject" value returned by a WebFinger resource MAY differ from
601601- the value of the "resource" parameter used in the client's request.
602602- This might happen, for example, when the subject's identity changes
603603- (e.g., a user moves his or her account to another service) or when
604604- the resource prefers to express URIs in canonical form.
605605-606606- The "subject" member SHOULD be present in the JRD.
607607-608608-4.4.2. aliases
609609-610610- The "aliases" array is an array of zero or more URI strings that
611611- identify the same entity as the "subject" URI.
612612-613613- The "aliases" array is OPTIONAL in the JRD.
614614-615615-616616-617617-618618-Jones, et al. Standards Track [Page 11]
619619-620620-RFC 7033 WebFinger September 2013
621621-622622-623623-4.4.3. properties
624624-625625- The "properties" object comprises zero or more name/value pairs whose
626626- names are URIs (referred to as "property identifiers") and whose
627627- values are strings or null. Properties are used to convey additional
628628- information about the subject of the JRD. As an example, consider
629629- this use of "properties":
630630-631631- "properties" : { "http://webfinger.example/ns/name" : "Bob Smith" }
632632-633633- The "properties" member is OPTIONAL in the JRD.
634634-635635-4.4.4. links
636636-637637- The "links" array has any number of member objects, each of which
638638- represents a link [4]. Each of these link objects can have the
639639- following members:
640640-641641- o rel
642642- o type
643643- o href
644644- o titles
645645- o properties
646646-647647- The "rel" and "href" members are strings representing the link's
648648- relation type and the target URI, respectively. The context of the
649649- link is the "subject" (see Section 4.4.1).
650650-651651- The "type" member is a string indicating what the media type of the
652652- result of dereferencing the link ought to be.
653653-654654- The order of elements in the "links" array MAY be interpreted as
655655- indicating an order of preference. Thus, if there are two or more
656656- link relations having the same "rel" value, the first link relation
657657- would indicate the user's preferred link.
658658-659659- The "links" array is OPTIONAL in the JRD.
660660-661661- Below, each of the members of the objects found in the "links" array
662662- is described in more detail. Each object in the "links" array,
663663- referred to as a "link relation object", is completely independent
664664- from any other object in the array; any requirement to include a
665665- given member in the link relation object refers only to that
666666- particular object.
667667-668668-669669-670670-671671-672672-673673-674674-Jones, et al. Standards Track [Page 12]
675675-676676-RFC 7033 WebFinger September 2013
677677-678678-679679-4.4.4.1. rel
680680-681681- The value of the "rel" member is a string that is either a URI or a
682682- registered relation type [8] (see RFC 5988 [4]). The value of the
683683- "rel" member MUST contain exactly one URI or registered relation
684684- type. The URI or registered relation type identifies the type of the
685685- link relation.
686686-687687- The other members of the object have meaning only once the type of
688688- link relation is understood. In some instances, the link relation
689689- will have associated semantics enabling the client to query for other
690690- resources on the Internet. In other instances, the link relation
691691- will have associated semantics enabling the client to utilize the
692692- other members of the link relation object without fetching additional
693693- external resources.
694694-695695- URI link relation type values are compared using the "Simple String
696696- Comparison" algorithm of Section 6.2.1 of RFC 3986.
697697-698698- The "rel" member MUST be present in the link relation object.
699699-700700-4.4.4.2. type
701701-702702- The value of the "type" member is a string that indicates the media
703703- type [9] of the target resource (see RFC 6838 [10]).
704704-705705- The "type" member is OPTIONAL in the link relation object.
706706-707707-4.4.4.3. href
708708-709709- The value of the "href" member is a string that contains a URI
710710- pointing to the target resource.
711711-712712- The "href" member is OPTIONAL in the link relation object.
713713-714714-4.4.4.4. titles
715715-716716- The "titles" object comprises zero or more name/value pairs whose
717717- names are a language tag [11] or the string "und". The string is
718718- human-readable and describes the link relation. More than one title
719719- for the link relation MAY be provided for the benefit of users who
720720- utilize the link relation, and, if used, a language identifier SHOULD
721721- be duly used as the name. If the language is unknown or unspecified,
722722- then the name is "und".
723723-724724- A JRD SHOULD NOT include more than one title identified with the same
725725- language tag (or "und") within the link relation object. Meaning is
726726- undefined if a link relation object includes more than one title
727727-728728-729729-730730-Jones, et al. Standards Track [Page 13]
731731-732732-RFC 7033 WebFinger September 2013
733733-734734-735735- named with the same language tag (or "und"), though this MUST NOT be
736736- treated as an error. A client MAY select whichever title or titles
737737- it wishes to utilize.
738738-739739- Here is an example of the "titles" object:
740740-741741- "titles" :
742742- {
743743- "en-us" : "The Magical World of Steve",
744744- "fr" : "Le Monde Magique de Steve"
745745- }
746746-747747- The "titles" member is OPTIONAL in the link relation object.
748748-749749-4.4.4.5. properties
750750-751751- The "properties" object within the link relation object comprises
752752- zero or more name/value pairs whose names are URIs (referred to as
753753- "property identifiers") and whose values are strings or null.
754754- Properties are used to convey additional information about the link
755755- relation. As an example, consider this use of "properties":
756756-757757- "properties" : { "http://webfinger.example/mail/port" : "993" }
758758-759759- The "properties" member is OPTIONAL in the link relation object.
760760-761761-4.5. WebFinger and URIs
762762-763763- WebFinger requests include a "resource" parameter (see Section 4.1)
764764- specifying the query target (URI) for which the client requests
765765- information. WebFinger is neutral regarding the scheme of such a
766766- URI: it could be an "acct" URI [18], an "http" or "https" URI, a
767767- "mailto" URI [19], or some other scheme.
768768-769769-5. Cross-Origin Resource Sharing (CORS)
770770-771771- WebFinger resources might not be accessible from a web browser due to
772772- "Same-Origin" policies. The current best practice is to make
773773- resources available to browsers through Cross-Origin Resource Sharing
774774- (CORS) [7], and servers MUST include the Access-Control-Allow-Origin
775775- HTTP header in responses. Servers SHOULD support the least
776776- restrictive setting by allowing any domain access to the WebFinger
777777- resource:
778778-779779- Access-Control-Allow-Origin: *
780780-781781-782782-783783-784784-785785-786786-Jones, et al. Standards Track [Page 14]
787787-788788-RFC 7033 WebFinger September 2013
789789-790790-791791- There are cases where defaulting to the least restrictive setting is
792792- not appropriate. For example, a server on an intranet that provides
793793- sensitive company information SHOULD NOT allow CORS requests from any
794794- domain, as that could allow leaking of that sensitive information. A
795795- server that wishes to restrict access to information from external
796796- entities SHOULD use a more restrictive Access-Control-Allow-Origin
797797- header.
798798-799799-6. Access Control
800800-801801- As with all web resources, access to the WebFinger resource could
802802- require authentication. Further, failure to provide required
803803- credentials might result in the server forbidding access or providing
804804- a different response than had the client authenticated with the
805805- server.
806806-807807- Likewise, a WebFinger resource MAY provide different responses to
808808- different clients based on other factors, such as whether the client
809809- is inside or outside a corporate network. As a concrete example, a
810810- query performed on the internal corporate network might return link
811811- relations to employee pictures, whereas link relations for employee
812812- pictures might not be provided to external entities.
813813-814814- Further, link relations provided in a WebFinger resource
815815- representation might point to web resources that impose access
816816- restrictions. For example, the aforementioned corporate server may
817817- provide both internal and external entities with URIs to employee
818818- pictures, but further authentication might be required in order for
819819- the client to access the picture resources if the request comes from
820820- outside the corporate network.
821821-822822- The decisions made with respect to what set of link relations a
823823- WebFinger resource provides to one client versus another and what
824824- resources require further authentication, as well as the specific
825825- authentication mechanisms employed, are outside the scope of this
826826- document.
827827-828828-7. Hosted WebFinger Services
829829-830830- As with most services provided on the Internet, it is possible for a
831831- domain owner to utilize "hosted" WebFinger services. By way of
832832- example, a domain owner might control most aspects of their domain
833833- but use a third-party hosting service for email. In the case of
834834- email, mail exchange (MX) records identify mail servers for a domain.
835835- An MX record points to the mail server to which mail for the domain
836836- should be delivered. To the sending server, it does not matter
837837- whether those MX records point to a server in the destination domain
838838- or a different domain.
839839-840840-841841-842842-Jones, et al. Standards Track [Page 15]
843843-844844-RFC 7033 WebFinger September 2013
845845-846846-847847- Likewise, a domain owner might utilize the services of a third party
848848- to provide WebFinger services on behalf of its users. Just as a
849849- domain owner is required to insert MX records into DNS to allow for
850850- hosted email services, the domain owner is required to redirect HTTP
851851- queries to its domain to allow for hosted WebFinger services.
852852-853853- When a query is issued to the WebFinger resource, the web server MUST
854854- return a response with a redirection status code that includes a
855855- Location header pointing to the location of the hosted WebFinger
856856- service URI. This WebFinger service URI does not need to point to
857857- the well-known WebFinger location on the hosting service provider
858858- server.
859859-860860- As an example, assume that example.com's WebFinger services are
861861- hosted by wf.example.net. Suppose a client issues a query for
862862- acct:alice@example.com like this:
863863-864864- GET /.well-known/webfinger?
865865- resource=acct%3Aalice%40example.com HTTP/1.1
866866- Host: example.com
867867-868868- The server might respond with this:
869869-870870- HTTP/1.1 307 Temporary Redirect
871871- Access-Control-Allow-Origin: *
872872- Location: https://wf.example.net/example.com/webfinger?
873873- resource=acct%3Aalice%40example.com
874874-875875- The client can then follow the redirection, reissuing the request to
876876- the URI provided in the Location header. Note that the server will
877877- include any required URI parameters in the Location header value,
878878- which could be different than the URI parameters the client
879879- originally used.
880880-881881-8. Definition of WebFinger Applications
882882-883883- This specification details the protocol syntax used to query a domain
884884- for information about a URI, the syntax of the JSON Resource
885885- Descriptor (JRD) that is returned in response to that query, security
886886- requirements and considerations, hosted WebFinger services, various
887887- expected HTTP status codes, and so forth. However, this
888888- specification does not enumerate the various possible properties or
889889- link relation types that might be used in conjunction with WebFinger
890890- for a particular application, nor does it define what properties or
891891- link relation types one might expect to see in response to querying
892892- for a particular URI or URI scheme. Nonetheless, all of these
893893- unspecified elements are important in order to implement an
894894- interoperable application that utilizes the WebFinger protocol and
895895-896896-897897-898898-Jones, et al. Standards Track [Page 16]
899899-900900-RFC 7033 WebFinger September 2013
901901-902902-903903- MUST be specified in the relevant document(s) defining the particular
904904- application making use of the WebFinger protocol according to the
905905- procedures described in this section.
906906-907907-8.1. Specification of the URI Scheme and URI
908908-909909- Any application that uses WebFinger MUST specify the URI scheme(s),
910910- and to the extent appropriate, what forms the URI(s) might take. For
911911- example, when querying for information about a user's account at some
912912- domain, it might make sense to specify the use of the "acct" URI
913913- scheme [18]. When trying to obtain the copyright information for a
914914- web page, it makes sense to specify the use of the web page URI
915915- (either http or https).
916916-917917- The examples in Sections 3.1 and 3.2 illustrate the use of different
918918- URI schemes with WebFinger applications. In the example in Section
919919- 3.1, WebFinger is used to retrieve information pertinent to OpenID
920920- Connect. In the example in Section 3.2, WebFinger is used to
921921- discover metadata information about a web page, including author and
922922- copyright information. Each of these WebFinger applications needs to
923923- be fully specified to ensure interoperability.
924924-925925-8.2. Host Resolution
926926-927927- As explained in Section 4, the host to which a WebFinger query is
928928- issued is significant. In general, WebFinger applications would
929929- adhere to the procedures described in Section 4 in order to properly
930930- direct a WebFinger query.
931931-932932- However, some URI schemes do not have host portions and there might
933933- be some applications of WebFinger for which the host portion of a URI
934934- cannot or should not be utilized. In such instances, the application
935935- specification MUST clearly define the host resolution procedures,
936936- which might include provisioning a "default" host within the client
937937- to which queries are directed.
938938-939939-8.3. Specification of Properties
940940-941941- WebFinger defines both subject-specific properties (i.e., properties
942942- described in Section 4.4.3 that relate to the URI for which
943943- information is queried) and link-specific properties (see Section
944944- 4.4.4.5). This section refers to subject-specific properties.
945945-946946- Applications that utilize subject-specific properties MUST define the
947947- URIs used in identifying those properties, along with valid property
948948- values.
949949-950950-951951-952952-953953-954954-Jones, et al. Standards Track [Page 17]
955955-956956-RFC 7033 WebFinger September 2013
957957-958958-959959- Consider this portion of the JRD found in the example in Section 3.2.
960960-961961- "properties" :
962962- {
963963- "http://blgx.example.net/ns/version" : "1.3",
964964- "http://blgx.example.net/ns/ext" : null
965965- }
966966-967967- Here, two properties are returned in the WebFinger response. Each of
968968- these would be defined in a WebFinger application specification.
969969- These two properties might be defined in the same WebFinger
970970- application specification or separately in different specifications.
971971- Since the latter is possible, it is important that WebFinger clients
972972- not assume that one property has any specific relationship with
973973- another property, unless some relationship is explicitly defined in
974974- the particular WebFinger application specification.
975975-976976-8.4. Specification of Links
977977-978978- The links returned in a WebFinger response each comprise several
979979- pieces of information, some of which are optional (refer to Section
980980- 4.4.4). The WebFinger application specification MUST define each
981981- link and any values associated with a link, including the link
982982- relation type ("rel"), the expected media type ("type"), properties,
983983- and titles.
984984-985985- The target URI to which the link refers (i.e., the "href"), if
986986- present, would not normally be specified in an application
987987- specification. However, the URI scheme or any special
988988- characteristics of the URI would usually be specified. If a
989989- particular link does not require an external reference, then all of
990990- the semantics related to the use of that link MUST be defined within
991991- the application specification. Such links might rely only on
992992- properties or titles in the link to convey meaning.
993993-994994-8.5. One URI, Multiple Applications
995995-996996- It is important to be mindful of the fact that different WebFinger
997997- applications might specify the use of the same URI scheme, and in
998998- effect, the same URI for different purposes. That should not be a
999999- problem, since each of property identifier (see Sections 4.4.3 and
10001000- 4.4.4.5) and link relation type would be uniquely defined for a
10011001- specific application.
10021002-10031003- It should be noted that when a client requests information about a
10041004- particular URI and receives a response with a number of different
10051005- property identifiers or link relation types that the response is
10061006- providing information about the URI without any particular semantics.
10071007-10081008-10091009-10101010-Jones, et al. Standards Track [Page 18]
10111011-10121012-RFC 7033 WebFinger September 2013
10131013-10141014-10151015- How the client interprets the information SHOULD be in accordance
10161016- with the particular application specification or set of
10171017- specifications the client implements.
10181018-10191019- Any syntactically valid properties or links the client receives and
10201020- that are not fully understood SHOULD be ignored and SHOULD NOT cause
10211021- the client to report an error.
10221022-10231023-8.6. Registration of Link Relation Types and Properties
10241024-10251025- Application specifications MAY define a simple token as a link
10261026- relation type for a link. In that case, the link relation type MUST
10271027- be registered with IANA as specified in Sections 10.3.
10281028-10291029- Further, any defined properties MUST be registered with IANA as
10301030- described in Section 10.4.
10311031-10321032-9. Security Considerations
10331033-10341034-9.1. Transport-Related Issues
10351035-10361036- Since this specification utilizes Cross-Origin Resource Sharing
10371037- (CORS) [7], all of the security considerations applicable to CORS are
10381038- also applicable to this specification.
10391039-10401040- The use of HTTPS is REQUIRED to ensure that information is not
10411041- modified during transit. It should be acknowledged that in
10421042- environments where a web server is normally available, there exists
10431043- the possibility that a compromised network might have its WebFinger
10441044- resource operating on HTTPS replaced with one operating only over
10451045- HTTP. As such, clients MUST NOT issue queries over a non-secure
10461046- connection.
10471047-10481048- Clients MUST verify that the certificate used on an HTTPS connection
10491049- is valid (as defined in [12]) and accept a response only if the
10501050- certificate is valid.
10511051-10521052-9.2. User Privacy Considerations
10531053-10541054- Service providers and users should be aware that placing information
10551055- on the Internet means that any user can access that information, and
10561056- WebFinger can be used to make it even easier to discover that
10571057- information. While WebFinger can be an extremely useful tool for
10581058- discovering one's avatar, blog, or other personal data, users should
10591059- also understand the risks.
10601060-10611061-10621062-10631063-10641064-10651065-10661066-Jones, et al. Standards Track [Page 19]
10671067-10681068-RFC 7033 WebFinger September 2013
10691069-10701070-10711071- Systems or services that expose personal data via WebFinger MUST
10721072- provide an interface by which users can select which data elements
10731073- are exposed through the WebFinger interface. For example, social
10741074- networking sites might allow users to mark certain data as "public"
10751075- and then utilize that marking as a means of determining what
10761076- information to expose via WebFinger. The information published via
10771077- WebFinger would thus comprise only the information marked as public
10781078- by the user. Further, the user has the ability to remove information
10791079- from publication via WebFinger by removing this marking.
10801080-10811081- WebFinger MUST NOT be used to provide any personal data unless
10821082- publishing that data via WebFinger by the relevant service was
10831083- explicitly authorized by the person whose information is being
10841084- shared. Publishing one's personal data within an access-controlled
10851085- or otherwise limited environment on the Internet does not equate to
10861086- providing implicit authorization of further publication of that data
10871087- via WebFinger.
10881088-10891089- The privacy and security concerns with publishing personal data via
10901090- WebFinger are worth emphasizing again with respect to personal data
10911091- that might reveal a user's current context (e.g., the user's
10921092- location). The power of WebFinger comes from providing a single
10931093- place where others can find pointers to information about a person,
10941094- but service providers and users should be mindful of the nature of
10951095- that information shared and the fact that it might be available for
10961096- the entire world to see. Sharing location information, for example,
10971097- would potentially put a person in danger from any individual who
10981098- might seek to inflict harm on that person.
10991099-11001100- Users should be aware of how easily personal data that one might
11011101- publish can be used in unintended ways. In one study relevant to
11021102- WebFinger-like services, Balduzzi et al. [20] took a large set of
11031103- leaked email addresses and demonstrated a number of potential privacy
11041104- concerns, including the ability to cross-correlate the same user's
11051105- accounts over multiple social networks. The authors also describe
11061106- potential mitigation strategies.
11071107-11081108- The easy access to user information via WebFinger was a design goal
11091109- of the protocol, not a limitation. If one wishes to limit access to
11101110- information available via WebFinger, such as WebFinger resources for
11111111- use inside a corporate network, the network administrator needs to
11121112- take necessary measures to limit access from outside the network.
11131113- Using standard methods for securing web resources, network
11141114- administrators do have the ability to control access to resources
11151115- that might return sensitive information. Further, a server can be
11161116- employed in such a way as to require authentication and prevent
11171117- disclosure of information to unauthorized entities.
11181118-11191119-11201120-11211121-11221122-Jones, et al. Standards Track [Page 20]
11231123-11241124-RFC 7033 WebFinger September 2013
11251125-11261126-11271127-9.3. Abuse Potential
11281128-11291129- Service providers should be mindful of the potential for abuse using
11301130- WebFinger.
11311131-11321132- As one example, one might query a WebFinger server only to discover
11331133- whether or not a given URI is valid. With such a query, the person
11341134- may deduce that an email identifier is valid, for example. Such an
11351135- approach could help spammers maintain a current list of known email
11361136- addresses and to discover new ones.
11371137-11381138- WebFinger could be used to associate a name or other personal data
11391139- with an email address, allowing spammers to craft more convincing
11401140- email messages. This might be of particular value in phishing
11411141- attempts.
11421142-11431143- It is RECOMMENDED that implementers of WebFinger server software take
11441144- steps to mitigate abuse, including malicious over-use of the server
11451145- and harvesting of user information. Although there is no mechanism
11461146- that can guarantee that publicly accessible WebFinger databases won't
11471147- be harvested, rate-limiting by IP address will prevent or at least
11481148- dramatically slow harvest by private individuals without access to
11491149- botnets or other distributed systems. The reason these mitigation
11501150- strategies are not mandatory is that the correct choice of mitigation
11511151- strategy (if any) depends greatly on the context. Implementers
11521152- should not construe this as meaning that they do not need to consider
11531153- whether to use a mitigation strategy, and if so, what strategy to
11541154- use.
11551155-11561156- WebFinger client developers should also be aware of potential abuse
11571157- by spammers or those phishing for information about users. As an
11581158- example, suppose a mail client was configured to automatically
11591159- perform a WebFinger query on the sender of each received mail
11601160- message. If a spammer sent an email using a unique identifier in the
11611161- 'From' header, then when the WebFinger query was performed, the
11621162- spammer would be able to associate the request with a particular
11631163- user's email address. This would provide information to the spammer,
11641164- including the user's IP address, the fact the user just checked
11651165- email, what kind of WebFinger client the user utilized, and so on.
11661166- For this reason, it is strongly advised that clients not perform
11671167- WebFinger queries unless authorized by the user to do so.
11681168-11691169-9.4. Information Reliability
11701170-11711171- A WebFinger resource has no means of ensuring that information
11721172- provided by a user is accurate. Likewise, neither the resource nor
11731173- the client can be absolutely guaranteed that information has not been
11741174- manipulated either at the server or along the communication path
11751175-11761176-11771177-11781178-Jones, et al. Standards Track [Page 21]
11791179-11801180-RFC 7033 WebFinger September 2013
11811181-11821182-11831183- between the client and server. Use of HTTPS helps to address some
11841184- concerns with manipulation of information along the communication
11851185- path, but it clearly cannot address issues where the resource
11861186- provided incorrect information, either due to being provided false
11871187- information or due to malicious behavior on the part of the server
11881188- administrator. As with any information service available on the
11891189- Internet, users should be wary of information received from untrusted
11901190- sources.
11911191-11921192-10. IANA Considerations
11931193-11941194-10.1. Well-Known URI
11951195-11961196- This specification registers the "webfinger" well-known URI in the
11971197- "Well-Known URIs" registry as defined by RFC 5785 [3].
11981198-11991199- URI suffix: webfinger
12001200-12011201- Change controller: IETF
12021202-12031203- Specification document(s): RFC 7033
12041204-12051205- Related information: The query to the WebFinger resource will
12061206- include one or more parameters in the query string; see Section 4.1
12071207- of RFC 7033. Resources at this location are able to return a JSON
12081208- Resource Descriptor (JRD) as described in Section 4.4 of RFC 7033.
12091209-12101210-10.2. JSON Resource Descriptor (JRD) Media Type
12111211-12121212- This specification registers the media type application/jrd+json for
12131213- use with WebFinger in accordance with media type registration
12141214- procedures defined in RFC 6838 [10].
12151215-12161216- Type name: application
12171217-12181218- Subtype name: jrd+json
12191219-12201220- Required parameters: N/A
12211221-12221222- Optional parameters: N/A
12231223-12241224- In particular, because RFC 4627 already defines the character
12251225- encoding for JSON, no "charset" parameter is used.
12261226-12271227- Encoding considerations: See RFC 6839, Section 3.1.
12281228-12291229-12301230-12311231-12321232-12331233-12341234-Jones, et al. Standards Track [Page 22]
12351235-12361236-RFC 7033 WebFinger September 2013
12371237-12381238-12391239- Security considerations:
12401240-12411241- The JSON Resource Descriptor (JRD) is a JavaScript Object Notation
12421242- (JSON) object. It is a text format that must be parsed by entities
12431243- that wish to utilize the format. Depending on the language and
12441244- mechanism used to parse a JSON object, it is possible for an
12451245- attacker to inject behavior into a running program. Therefore,
12461246- care must be taken to properly parse a received JRD to ensure that
12471247- only a valid JSON object is present and that no JavaScript or other
12481248- code is injected or executed unexpectedly.
12491249-12501250- Interoperability considerations:
12511251-12521252- This media type is a JavaScript Object Notation (JSON) object and
12531253- can be consumed by any software application that can consume JSON
12541254- objects.
12551255-12561256- Published specification: RFC 7033
12571257-12581258- Applications that use this media type:
12591259-12601260- The JSON Resource Descriptor (JRD) is used by the WebFinger
12611261- protocol (RFC 7033) to enable the exchange of information between a
12621262- client and a WebFinger resource over HTTPS.
12631263-12641264- Fragment identifier considerations:
12651265-12661266- The syntax and semantics of fragment identifiers SHOULD be as
12671267- specified for "application/json". (At publication of this
12681268- document, there is no fragment identification syntax defined for
12691269- "application/json".)
12701270-12711271- Additional information:
12721272-12731273- Deprecated alias names for this type: N/A
12741274-12751275- Magic number(s): N/A
12761276-12771277- File extension(s): jrd
12781278-12791279- Macintosh file type code(s): N/A
12801280-12811281- Person & email address to contact for further information:
12821282-12831283- Paul E. Jones <paulej@packetizer.com>
12841284-12851285- Intended usage: COMMON
12861286-12871287-12881288-12891289-12901290-Jones, et al. Standards Track [Page 23]
12911291-12921292-RFC 7033 WebFinger September 2013
12931293-12941294-12951295- Restrictions on usage: N/A
12961296-12971297- Author: Paul E. Jones <paulej@packetizer.com>
12981298-12991299- Change controller:
13001300-13011301- IESG has change control over this registration.
13021302-13031303- Provisional registration? (standards tree only): N/A
13041304-13051305-10.3. Registering Link Relation Types
13061306-13071307- RFC 5988 established a "Link Relation Types" registry that is reused
13081308- by WebFinger applications.
13091309-13101310- Link relation types used by WebFinger applications are registered in
13111311- the "Link Relation Types" registry as per the procedures of Section
13121312- 6.2.1 of RFC 5988. The "Notes" entry for the registration SHOULD
13131313- indicate if property values associated with the link relation type
13141314- are registered in the "WebFinger Properties" registry with a link to
13151315- the registry.
13161316-13171317-10.4. Establishment of the "WebFinger Properties" Registry
13181318-13191319- WebFinger utilizes URIs to identify properties of a subject or link
13201320- and the associated values (see Sections 8.3 and 8.6). This
13211321- specification establishes a new "WebFinger Properties" registry to
13221322- record property identifiers.
13231323-13241324-10.4.1. The Registration Template
13251325-13261326- The registration template for WebFinger properties is:
13271327-13281328- o Property Identifier:
13291329-13301330- o Link Type:
13311331-13321332- o Description:
13331333-13341334- o Reference:
13351335-13361336- o Notes: [optional]
13371337-13381338- The "Property Identifier" must be a URI that identifies the property
13391339- being registered.
13401340-13411341-13421342-13431343-13441344-13451345-13461346-Jones, et al. Standards Track [Page 24]
13471347-13481348-RFC 7033 WebFinger September 2013
13491349-13501350-13511351- The "Link Type" contains the name of a link relation type with which
13521352- this property identifier is used. If the property is a subject-
13531353- specific property, then this field is specified as "N/A".
13541354-13551355- The "Description" is intended to explain the purpose of the property.
13561356-13571357- The "Reference" field points to the specification that defines the
13581358- registered property.
13591359-13601360- The optional "Notes" field is for conveying any useful information
13611361- about the property that might be of value to implementers.
13621362-13631363-10.4.2. The Registration Procedures
13641364-13651365- The IETF has created a mailing list, webfinger@ietf.org, which can be
13661366- used for public discussion of the WebFinger protocol and any
13671367- applications that use it. Prior to registration of a WebFinger
13681368- property, discussion on the mailing list is strongly encouraged. The
13691369- IESG has appointed Designated Experts [13] who will monitor the
13701370- webfinger@ietf.org mailing list and review registrations.
13711371-13721372- A WebFinger property is registered with a Specification Required (see
13731373- RFC 5226 [13]) after a review by the Designated Experts. The review
13741374- is normally expected to take on the order of two to four weeks.
13751375- However, the Designated Experts may approve a registration prior to
13761376- publication of a specification once the Designated Experts are
13771377- satisfied that such a specification will be published. In evaluating
13781378- registration requests, the Designated Experts should make an effort
13791379- to avoid registering two different properties that have the same
13801380- meaning. Where a proposed property is similar to an already-defined
13811381- property, the Designated Experts should insist that enough text be
13821382- included in the description or notes section of the template to
13831383- sufficiently differentiate the new property from an existing one.
13841384-13851385- The registration procedure begins with a completed registration
13861386- template (as defined above) sent to webfinger@ietf.org. Once
13871387- consensus is reached on the mailing list, the registration template
13881388- is sent to iana@iana.org. IANA will then contact the Designated
13891389- Experts and communicate the results to the registrant. The WebFinger
13901390- mailing list provides an opportunity for community discussion and
13911391- input, and the Designated Experts may use that input to inform their
13921392- review. Denials should include an explanation and, if applicable,
13931393- suggestions as to how to make the request successful if resubmitted.
13941394-13951395-13961396-13971397-13981398-13991399-14001400-14011401-14021402-Jones, et al. Standards Track [Page 25]
14031403-14041404-RFC 7033 WebFinger September 2013
14051405-14061406-14071407- The specification registering the WebFinger property MUST include the
14081408- completed registration template shown above. Once the registration
14091409- procedure concludes successfully, IANA creates or modifies the
14101410- corresponding record in the "WebFinger Properties" registry.
14111411-14121412-11. Acknowledgments
14131413-14141414- This document has benefited from extensive discussion and review by
14151415- many of the members of the APPSAWG working group. The authors would
14161416- like to especially acknowledge the invaluable input of Eran Hammer-
14171417- Lahav, Blaine Cook, Brad Fitzpatrick, Laurent-Walter Goix, Joe
14181418- Clarke, Peter Saint-Andre, Dick Hardt, Tim Bray, James Snell, Melvin
14191419- Carvalho, Evan Prodromou, Mark Nottingham, Elf Pavlik, Bjoern
14201420- Hoehrmann, Subramanian Moonesamy, Joe Gregorio, John Bradley, and
14211421- others that we have undoubtedly, but inadvertently, missed.
14221422-14231423- The authors would also like to express their gratitude to the chairs
14241424- of the APPSAWG working group, especially Salvatore Loreto for his
14251425- assistance in shepherding this document. We also want to thank Barry
14261426- Leiba and Pete Resnick, the Applications Area Directors, for their
14271427- support and exhaustive reviews.
14281428-14291429-12. References
14301430-14311431-12.1. Normative References
14321432-14331433- [1] Bradner, S., "Key words for use in RFCs to Indicate Requirement
14341434- Levels", BCP 14, RFC 2119, March 1997.
14351435-14361436- [2] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
14371437- Leach, P., and T. Berners-Lee, "Hypertext Transfer Protocol
14381438- -- HTTP/1.1", RFC 2616, June 1999.
14391439-14401440- [3] Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known
14411441- Uniform Resource Identifiers (URIs)", RFC 5785, April 2010.
14421442-14431443- [4] Nottingham, M., "Web Linking", RFC 5988, October 2010.
14441444-14451445- [5] Crockford, D., "The application/json Media Type for JavaScript
14461446- Object Notation (JSON)", RFC 4627, July 2006.
14471447-14481448- [6] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
14491449- Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986,
14501450- January 2005.
14511451-14521452- [7] Van Kesteren, A., "Cross-Origin Resource Sharing", W3C CORS,
14531453- July 2010, <http://www.w3.org/TR/cors/>.
14541454-14551455-14561456-14571457-14581458-Jones, et al. Standards Track [Page 26]
14591459-14601460-RFC 7033 WebFinger September 2013
14611461-14621462-14631463- [8] IANA, "Link Relations",
14641464- <http://www.iana.org/assignments/link-relations/>.
14651465-14661466- [9] IANA, "MIME Media Types",
14671467- <http://www.iana.org/assignments/media-types>.
14681468-14691469- [10] Freed, N., Klensin, J., and T. Hansen, "Media Type
14701470- Specifications and Registration Procedures", BCP 13, RFC 6838,
14711471- January 2013.
14721472-14731473- [11] Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying
14741474- Languages", BCP 47, RFC 5646, September 2009.
14751475-14761476- [12] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
14771477-14781478- [13] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA
14791479- Considerations Section in RFCs", BCP 26, RFC 5226, May 2008.
14801480-14811481-12.2. Informative References
14821482-14831483- [14] Perreault, S., "vCard Format Specification", RFC 6350, August
14841484- 2011.
14851485-14861486- [15] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B.,
14871487- Mortimore, C., and E. Jay, "OpenID Connect Messages 1.0",
14881488- July 2013,
14891489- <http://openid.net/specs/openid-connect-messages-1_0.html>.
14901490-14911491- [16] Hammer-Lahav, E., Ed., and B. Cook, "Web Host Metadata", RFC
14921492- 6415, October 2011.
14931493-14941494- [17] Hammer-Lahav, E. and W. Norris, "Extensible Resource Descriptor
14951495- (XRD) Version 1.0",
14961496- <http://docs.oasis-open.org/xri/xrd/v1.0/xrd-1.0.html>.
14971497-14981498- [18] Saint-Andre, P., "The 'acct' URI Scheme", Work in Progress,
14991499- July 2013.
15001500-15011501- [19] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto' URI
15021502- Scheme", RFC 6068, October 2010.
15031503-15041504- [20] Balduzzi, M., Platzer, C., Thorsten, H., Kirda, E., Balzarotti,
15051505- D., and C. Kruegel "Abusing Social Networks for Automated User
15061506- Profiling", Recent Advances in Intrusion Detection, Springer
15071507- Berlin Heidelberg, March 2010,
15081508- <https://www.eurecom.fr/en/publication/3042/download/
15091509- rs-publi-3042_1.pdf>.
15101510-15111511-15121512-15131513-15141514-Jones, et al. Standards Track [Page 27]
15151515-15161516-RFC 7033 WebFinger September 2013
15171517-15181518-15191519-Authors' Addresses
15201520-15211521- Paul E. Jones
15221522- Cisco Systems, Inc.
15231523- 7025 Kit Creek Rd.
15241524- Research Triangle Park, NC 27709
15251525- USA
15261526-15271527- Phone: +1 919 476 2048
15281528- EMail: paulej@packetizer.com
15291529- IM: xmpp:paulej@packetizer.com
15301530-15311531-15321532- Gonzalo Salgueiro
15331533- Cisco Systems, Inc.
15341534- 7025 Kit Creek Rd.
15351535- Research Triangle Park, NC 27709
15361536- USA
15371537-15381538- Phone: +1 919 392 3266
15391539- EMail: gsalguei@cisco.com
15401540- IM: xmpp:gsalguei@cisco.com
15411541-15421542-15431543- Michael B. Jones
15441544- Microsoft
15451545-15461546- EMail: mbj@microsoft.com
15471547- URI: http://self-issued.info/
15481548-15491549-15501550- Joseph Smarr
15511551- Google
15521552-15531553- EMail: jsmarr@google.com
15541554- URI: http://josephsmarr.com/
15551555-15561556-15571557-15581558-15591559-15601560-15611561-15621562-15631563-15641564-15651565-15661566-15671567-15681568-15691569-15701570-Jones, et al. Standards Track [Page 28]
15711571-