Exploration d'ActivityPub

Hackday Marmelab - 04/11/2020

Qu'est-ce que c'est ?

Un standard (W3C) ouvert pour réseaux sociaux décentralisés

Pour faire quoi ?

Décentraliser les réseaux sociaux et éviter les silos actuels

Rendre les réseaux interopérables

 Stéphane Bortzmeyer

bortzmeyer@mastodon.gougere.fr

Qu'est-ce que j’attends d'un réseau social décentralisé ?

* Pouvoir interagir avec des personnes présentes sur un autre réseau.

* Pouvoir changer de réseau sans en perdre mon historique ni mes amis.

Le protocole ActivityPub

  1. ActivityPub défini les grandes lignes de comment au sein d'un même réseau (client/serveur) et entre différentes instances de réseau les échanges ont lieu.
  2. ActivityStream détaille le contenu de ces échanges ! Bref tente de standardiser les échanges qui peuvent avoir lieu au sein d'un réseau social (je publie une photos, je like un post, je commente un article ...) Et là cela se complique !
  3. Activity Vocabulary tente quand à lui de définir les intervenants et objet interagissant au sein d'un réseau social. Pas facile non plus ^^.

Presque une grosse boite email

La spécification définit, entre autres, trois types d'objets :

  • Les acteurs : Application, Groupe, Organisation, Personne, Service.
  • Les types d'activité : Accepter, Ajouter, Annoncer, Arriver, Bloquer, Créer, Supprimer, Ne pas aimer, Marquer, Suivre, Ignorer, Inviter, Rejoindre, Quitter, Aimer, Écouter, Déplacer, Offrir, Questionner, Lire, Rejeter, Supprimer, Tentative d'acceptation, Tentative de rejet, Voyager, Annuler, Mettre à jour, Voir.
  • Des objets : Article, audio, document, événement, image, note, page, lieu, profil, relation, pierre tombale, vidéo.

 

Pour créer une activité de flux d'activités valide, vous devez choisir un objet de chaque catégorie (un acteur, un type d'activité et un objet) et y ajouter des métadonnées (à qui s'adresse le flux par exemple).

Vous décrivez que quelque chose a fait quelque chose à ou avec quelque chose, et vous expliquez ces choses plus en détail.

DEMO \o/

WebFinger

{
  "subject":"acct:marmelab@fede.alexisjanvier.net",
  "links":[
    {
      "rel":"self",
      "type":"application/activity+json",
      "href":"https://fede.alexisjanvier.net/u/marmelab"
    }
  ]
}

HTTP Signatures

curl -X POST --cert client-cert.pem --key key.pem
-H Date: <req-date>
-H Digest: SHA-256=2ajR8Q+lBNm0eQW9DWWX8dZDZLB8+h0Rgmu0UCDdFrw=
-H Authorization: Signature keyId=<key-id>,algorithm="rsa-sha256",headers="(request-target) date digest",signature=<signature-string>
-H Content-Type: application/x-www-form-urlencoded
-d grant_type=client_credentials&scope=scope1
https://localhost:9443/oauth2/token
{
    "@context": [
        "https://www.w3.org/ns/activitystreams",
        "https://w3id.org/security/v1"
    ],
    "id": "https://fede.alexisjanvier.net/u/marmelab",
    "type": "Person",
    "preferredUsername": "marmelab",
    "inbox": "https://fede.alexisjanvier.net/api/inbox",
    "followers": "https://fede.alexisjanvier.net/u/marmelab/followers",
    "publicKey": {
        "id": "https://fede.alexisjanvier.net/u/marmelab#main-key",
        "owner": "https://fede.alexisjanvier.net/u/marmelab",
        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nM---END PUBLIC KEY-----\n"
    }
}

https://fede.alexisjanvier.net/u/marmelab

Nouvelle note

{
    "id": "https://fede.alexisjanvier.net/m/6543a008abd33ec09875a3fa87e63654",
    "type": "Note",
    "published": "2020-11-04T13:34:11.099Z",
    "attributedTo": "https://fede.alexisjanvier.net/u/marmelab",
    "content": "Jazz is not dead, it's just smell funny",
    "to": [
        "https://www.w3.org/ns/activitystreams#Public"
    ]
}

Diffusion de la nouvelle note

{
    "@context": "https://www.w3.org/ns/activitystreams",
    "id": "https://fede.alexisjanvier.net/m/0df0cd144e9383dca8aab72b5c1bfbe7",
    "type": "Create",
    "actor": "https://fede.alexisjanvier.net/u/marmelab",
    "to": [
        "https://www.w3.org/ns/activitystreams#Public"
    ],
    "cc": [
        "https://mamot.fr/users/alexisjanvier"
    ],
    "object": {
        "id": "https://fede.alexisjanvier.net/m/6543a008abd33ec09875a3fa87e63654",
        "type": "Note",
        "published": "2020-11-04T13:34:11.099Z",
        "attributedTo": "https://fede.alexisjanvier.net/u/marmelab",
        "content": "Jazz is not dead, it's just smell funny",
        "to": [
            "https://www.w3.org/ns/activitystreams#Public"
        ]
    }
}

Conclusions