2024-09-19-ean
Mastodon eta activitiy pub protokolako sarrera
0 - Sarrera
Mastodon Activity Pub protokoloan oinarritutako sare sozial bat da.
Protokoloa libre denez, nola erabil dezakegun dokumentuta dago eta errazagoa da zure inplementazio propioa egitea.
Nire kasuan, hemen agertuko den kodigoa PHP izango da, baina edozein programazio-lengoia erabil dezakezue.
1 - Sinadura sortzeko artxiboak
Bidaltzen ditugun datuak guretik etorzen direla ziurtatzeko, sinadura bat bidaltzen dugu aldi berean.
Sinadura hori guk bakarrik sor dezakegu, eta jasotzaileak mezua jasotzean egiaztatuko du sinadura egokia dela.
Sinadura bat sortzeko lehen etapa enkriptazio-gakoak sortzea da:
$ openssl genrsa -out private.pem 2048
$ openssl rsa -in private.pem -outform PEM -pubout -out public.pem
Komando hori 2 artxibo sortuko ditu, eta artxibo horiek erabiliko ditugu sinadura egiteko.
1 - Bilaketak eta erantzunak
Edozein mastodon intantziatik bila dezakegu edozein kontua.
Adibidez, nire kasuan @tfe@mastodon.eus kontua daukat, baina aurki dezaket mastodon.social instantziatik.
Hori lortzeko, serbidoreak "/.well-known/webfinger" webgunea (API) aztertuko du, bilatutako kontua gehituz.
Adibidez:
https://mastodon.eus/.well-known/webfinger?resource=acct:tfe@mastodon.eus
Erantzunean oinarrizko informazio agertzen da:
{
"subject": "acct:tfe@mastodon.eus",
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://mastodon.eus/users/tfe"
},
{
"rel": "http://webfinger.net/rel/avatar",
"type": "image/jpeg",
"href": "https://mastodon.eus/system/accounts/avatars/109/370/411/717/837/024/original/da48e6dbd7f018c9.jpg"
}
]
}
PHP inplementazio simple bat daukazue hemen.
2 - Kontuaren informazioa
Ikusi dugun bezala, bilaketa erantzutean, serbidoreak erantzuten du oinarrizko informazioa. Kontu baten informazio gehiago lortzeko, helbide bat daukagu:
Kontuaren informazio guztia agertzen da bertan. Adibidez: https://mastodon.eus/users/tfe
Baina esteka hori nabigatzaile batekin bisitatzen badugu, ez dugu ezer ikusiko. Informazioa lortzeko, HTTP Header "Accept: application/json" ezarri behar dugu.
Adibidez, terminal leiho batean:
$ curl https://mastodon.eus/users/tfe -H "Accept: application/json"
Edo, nire inplementazioan (partiturak.eus-en) ikusgai dago: partiturak.eus-en kontuaren informazioa.
Jasotzen dugun informazioa:
{
"id": "https://mastodon.eus/users/tfe",
"type": "Person",
"following": "https://mastodon.eus/users/tfe/following",
"followers": "https://mastodon.eus/users/tfe/followers",
"inbox": "https://mastodon.eus/users/tfe/inbox",
"outbox": "https://mastodon.eus/users/tfe/outbox",
"preferredUsername": "tfe",
"name": "Tfe :belarriprest:",
.....
}
Informazio garrantzitsuak agertzen dira:
- id: nor da
- following eta followers: URL bat informazioa lortzeko
- inbox eta outbox: URL bat informazioa bidaltzeko edo jasotzeko (erabiliko dugu hori hurrengo atalean)
- publicKey: informazio horrekin jakingo dugu zein da kontuaren gakoa
publicKey beti hasten da "----BEGIN PUBLIC KEY-----"-ekin eta bukatzen da "----END PUBLIC KEY-----"-ekin.
Adibide bet aurki dezakegu hemen: https://partiturak.eus/activityPub/users/partiturak
3 - Jarraitu eta onartu
Erabiltzaileak "Jarraitu" botoian click egiten du bitartean, eskaera bat jasotzen du serbidoreak.
Erabiltzaileak "Follow" eskaera egiten du "inbox" orrian, eta json datuak horiekin:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://mastodon.eus/058fd540-1fd9-4b8b-aad4-ec051ace5421",
"type": "Follow",
"actor": "https://mastodon.eus/users/tfe",
"object": "https://partiturak.eus/activityPub/users/12345"
}
Hemen:
- id: esteka berezi bat
- type: Follow
- actor: Click egiten duen kontuaren esteka
- object: Nork jarraitu nahi dugun
Mezu mota hori jasotzean, serbidoreak galdetuko du nor da "actor"-ea, beren "inbox" esteka jakiteko:
Adibidez:
$ curl https://mastodon.eus/users/tfe -H "Accept: application/json"
Eta jarraian bidaliko diot onarpen mezua, "inbox" (https://mastodon.eus/users/tfe/inbox) helbidean.
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "partiturak accepted a follow",
"type": "Accept",
"actor": "https://mastodon.eus/users/tfe",
"object": "https://partiturak.eus/activityPub/users/12345"
}
Baina mezua hori bidaltzeko, gure datuak izenpetu behar ditugu.
4 - Mezuak bidali sinadura batekin
Esan dugun bezala, mezu bat bidali behar dugu bakoitzean sinadura bat sortuko dugu eta mezuarekin bidaliko dugu.
2_sinadura.php estekan aurkituko duzue php implementazio bat.
$headers = [
'accept: application/activity+json, text/json',
'host: '.$inboxUrl['host'],
'date: '.$date,
'digest: '.$digest,
'signature: '.$signatureHeader,
'content-type: application/activity+json',
];
$ch=curl_init($actorInbox);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 1);
Kodigo honekin edozein instantziari bidal diezaizkiokegu mezuak.