Fediverse ID (Fediverse)

by

The final say for what is and is not a valid Fediverse ID are the many implementations of WebFinger in-the-wild in all the different Fediverse software out there. (Which could be different from each other.)

Because, from a technical point-of-view, a Fediverse ID is turned into an acct URI and then resolved with WebFinger.

Also, there currently is no canonical syntax for a Fediverse ID. Currently, the syntax of a Fediverse ID is whatever each implementation supports. (Which again could be different from each other.)

But, having said that, we can infer a minimum syntax for what should be considered a validFediverse ID. I.e., the syntax that any implmentation for Fediverse IDs should support. But, to say it explicitly, an implemention for Fediverse IDs could support more than just what is given by this syntax.

acct URI

Part of the process of resolving a Fediverse ID transfomrs a Fediverse ID into an acct URI. (And then using that acct URI version of the Fediverse ID makes a request to WebFinger.)

Here is an example of transforming a Fediverse ID into an acct URI:


     at sign
       ↓
       @joeblow@example.com ← Fediverse ID

   acct:joeblow@example.com ← acct URI
       ↑
  no at sign

A client would then make a request to:

https://example.com/.well-known/host-meta

To discover what the (template) URL for WebFinger is. And then, for example, if it is at:

https://example.com/.well-known/webfinger?resource={uri}

Then make a request to:

https://example.com/.well-known/webfinger?resource=acct:joeblow@example.com

Fediverse ID Syntax

Inferring from IETF RFC-7565 (The 'acct' URI Scheme) and referenced IEFC RFCs, the syntax of a Fediverse ID is:

fediverseID = "@" actor "@" host

Where “actor” is defined as:

actor       = unreserved / sub-delims 0*( unreserved / pct-encoded / sub-delims )

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

pct-encoded = "%" HEXDIG HEXDIG

ALPHA       =  %x41-5A / %x61-7A   ; A-Z / a-z

DIGIT       =  %x30-39             ; 0-9

HEXDIG      =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

(Again note that an implementation could support more characters for “actor” than what is given by this definition.)

And “host” is defined as

host        = IP-literal / IPv4address / reg-name

IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"

IPv6address =                            6( h16 ":" ) ls32
            /                       "::" 5( h16 ":" ) ls32
            / [               h16 ] "::" 4( h16 ":" ) ls32
            / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
            / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
            / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
            / [ *4( h16 ":" ) h16 ] "::"              ls32
            / [ *5( h16 ":" ) h16 ] "::"              h16
            / [ *6( h16 ":" ) h16 ] "::"

h16         = 1*4HEXDIG

ls32        = ( h16 ":" h16 ) / IPv4address

IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
            / %x31-39 DIGIT         ; 10-99
            / "1" 2DIGIT            ; 100-199
            / "2" %x30-34 DIGIT     ; 200-249
            / "25" %x30-35          ; 250-255

reg-name    = *( unreserved / pct-encoded / sub-delims )