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 (и некоторых других), работающих в безопасном режиме.

Другие вопросы по тегам