Activitypub & Mastodon, как получить актера?
Вопрос
В настоящее время я пытаюсь реализовать ActivityPub на своем сервере, чтобы он мог взаимодействовать с мастодонтом. Я застрял, пытаясь получить актера из другого экземпляра мастодонта. Актер содержит такие вещи, как входящие, исходящие и открытый ключ для проверки запросов, подписанных актером.
Кажется, чтобы получить актера, мне нужно отправить подписанный запрос на получение. Хотя я знаю, как подписать запрос, у меня есть проблема с куриным яйцом, потому что документ json-ld, представляющий актера, будет содержать открытый ключ для проверки запроса от этого актера. Следовательно, если бы я должен был подписать запрос своим ключом, то экземпляр, чей актор я пытаюсь получить, чтобы проверить ключ, также должен был бы получить мой открытый ключ и, следовательно, мой актор. Но если это так, и я также проверяю подпись, то мне нужно было бы получить тот актор, к которому я пытался получить доступ в первую очередь, чтобы получить его открытый ключ для этого.
Как разрешить эту ситуацию с куриным яйцом? И почему мастодонты не сталкиваются с той же проблемой, они что-то делают по-другому?
Что я пробовал до сих пор
Я создал учетную запись на каком-то существующем экземпляре мастодонта. Я могу найти URL актера с помощью webfinger:
curl https://awoo.space/.well-known/webfinger?resource=acct:DPA@awoo.space | jq
{
"subject": "acct:DPA@awoo.space",
"aliases": [
"https://awoo.space/@DPA",
"https://awoo.space/users/DPA"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://awoo.space/@DPA"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://awoo.space/users/DPA"
},
{
"rel": "http://ostatus.org/schema/1.0/subscribe",
"template": "https://awoo.space/authorize_interaction?uri={uri}"
}
]
}
Итак, для этой учетной записи URL-адрес актераhttps://awoo.space/users/DPA
. Но если я попытаюсь получить объект актера:
curl -H 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"' https://awoo.space/users/DPA
Я получаю ошибку: 401,Request not signed
.
Честно говоря, я не понимаю, почему этот запрос должен быть подписан. Для примеров, которые я нашел в Интернете, это не так, но в этом случае по какой-то причине ему нужна подпись, и я хочу правильно с этим справиться.
1 ответ
Это странная, несколько известная особенность ActivityPub, которая представляет собой проблему в теории, но не на практике. Короткий ответ: подпишите свои исходящие запросы AP актером из вашего собственного экземпляра, любым актером, и удаленный экземпляр обычно примет эти подписи и с радостью ответит, даже если он заранее не видел вашего подписывающего актера.
(У меня уже были разговоры об этом на площадках AP, но я не смог найти их на https://socialhub.activitypub.rocks/ для цитирования, возможно, вместо этого они были в чате.)
Я подозреваю, что многие реализации AP решают эту проблему с помощью TOFU под прикрытием. Т.е. если удаленный экземпляр получаетGET
подписанный неизвестным субъектом, он извлекает этого субъекта и только затем начинает проверять его подписи. Это может произойти синхронно при первом запросе (и заблокировать его) или в фоновом режиме.
Кроме того, @Daniel Albrecht прав, обычно это имеет значение только для экземпляров Mastodon (и некоторых других), работающих в безопасном режиме.