activitypub-http-signatures
/icons/hr.icon
lacolaco.icon まだ使ったことないけど見つけた。ソースコードがGitLabなので見つかりにくかった
lacolaco.icon draft 08実装らしいが、Mastodonと互換性あるのだろうか?
nullkal.icon 使ってみた。マストドンと会話できたけど、TypeScriptの型情報がないのと、しばらく放置気味なせいかnodeの対応バージョンが古めのままなので、実用するにはなんとかしたほうがいいかも。
サンプルコード
nullkal.icon ↓のコードでマストドンのFollowアクティビティにAcceptレスポンスが返せました。
any使ってるのはご愛敬……w
code:typescript
import { Sha256Signer } from "activitypub-http-signatures"
import * as crypto from "crypto"
import fetch from "node-fetch"
const privateKey = `-----BEGIN RSA PRIVATE KEY-----
${process.env.PRIVATE_KEY}
-----END RSA PRIVATE KEY-----`;
const signedFetch = async (url: string, options: any) => {
const digest = options.body ?
SHA-256=${crypto.createHash("sha256").update(options.body).digest("base64")}
: null
const headerNames = ["(request-target)", "host", "date", ...(digest ? "digest" : []) ] const headers = {
digest,
...options.headers,
}
const method = options.method || "GET"
const signer = new Sha256Signer({
publicKeyId,
privateKey,
headerNames,
})
const signature = signer.sign({ url, method, headers })
return await fetch(url, {
...options,
headers: {
...headers,
signature,
accept: "application/ld+json",
},
})
}
// 実際にAccept返すところ
const acceptRequestJson = {
id: http://my-site.example/@nullkal/outbox/1,
type: "Accept",
actor: http://my-site.example/@nullkal,
object: body,
}
const resp = await signedFetch(actor.inbox, {
method: "POST",
body: JSON.stringify(acceptRequestJson),
headers: {
"Content-Type": "application/activity+json",
},
})
console.log(
Response: ${resp.status} ${resp.statusText}: ${await resp.text()}}
)