New compatibility table at funfedi.dev: JSON-LD @context
https://funfedi.dev/support_tables/generated/context/
6 out of 9 implementations accept any @context value. But Mastodon, Hollo and Friendica reject activity entirely if https://www.w3.org/ns/activitystreams is not included in @context. Mastodon probably does this for no reason, but what about #Friendica and #Hollo?
#ActivityPub specification, section 3. Objects:
Implementers SHOULD include the ActivityPub context in their object definitions. Implementers MAY include additional context as appropriate.
ActivityPub context is recommended, but not required.
@dimkr The signature (proofValue) seems to be wrong.
Step by step:
Canonicalized object
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/data-integrity/v1"],"alsoKnownAs":["https://hd.206267.xyz/user/dimkr"],"assertionMethod":[{"controller":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor","id":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor#ed25519-key","publicKeyMultibase":"z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD","type":"Multikey"}],"attachment":[{"name":"tootik","type":"PropertyValue","value":"<p><a href=\"https://github.com/dimkr/tootik\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/dimkr/tootik</a></p>"},{"name":"Vanilla Dpup","type":"PropertyValue","value":"<p><a href=\"https://vanilla-dpup.github.io\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://vanilla-dpup.github.io</a>/</p>"},{"name":"gplaces","type":"PropertyValue","value":"<p><a href=\"https://flathub.org/en/apps/com.github.dimkr.gplaces\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://flathub.org/en/apps/com.github.dimkr.gplaces</a></p>"}],"followers":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor/followers","gateways":["https://didkey.000090000.xyz"],"icon":{"url":"https://didkey.000090000.xyz/icon/dimkr.gif#1755961431245924999"},"id":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor","inbox":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor/inbox","manuallyApprovesFollowers":false,"outbox":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor/outbox","preferredUsername":"dimkr","publicKey":{"id":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor#main-key","owner":"https://didkey.000090000.xyz/.well-known/apgateway/did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD/actor","publicKeyPem":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoaOeaVtKeskW7Hw++6gKe/i+N5h70UpeswrAzDoUbDkjLhN5jQNR\nLJ9GadBYESFQpMVfFXYgwce0r62nVuMd9mQnN9XvjFag02cWyPi/d2fIPGNbUnv4\nbRqbGjaueM0te+1rE/gYEUWibcpu3SR9+oKp2ycyxfic/QIcjxgwLF7DZWvHWV1/\n76xc3t6KklEjm3PkbNPjmGnpUPF3tOdqqKeo4ZuQHBlRV9A/ADvZg9JHQLkYsVUq\nheDCdlKzAKXbartgGEPRijFQ0FtuFThXH9dGmGQwv0BBnfufWXUHAyQ9UELY1S4J\nXIZxuhNszFnSed6btu9+pVsxHI8+O3GcgwIDAQAB\n-----END RSA PUBLIC KEY-----\n"},"summary":"<p>Thinker, tinkerer and trumpet player 🎺</p><p>Admin of <a href=\"gemini://hd.206267.xyz\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gemini://hd.206267.xyz</a></p>","type":"Person","updated":"2025-08-23T15:49:43.844507503Z"}Canonicalized proof config
{"created":"2025-08-23T21:48:03Z","cryptosuite":"eddsa-jcs-2022","proofPurpose":"assertionMethod","type":"DataIntegrityProof","verificationMethod":"did🔑z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD#z6MkoQhyST3stSA687x4jMq8Rc59cBD7FLeXs9p1MXQuQqYD"}Object hash
b77da99397ed29b9ffd999069e366b55a0590b94996a36f389968dc31ae1f237Proof config hash
e4926adc72de5b70105af16e20d4edaa68ccd27a7221972590bbf2825ab76560I’ve re-started building with ActivityPub’s #c2s API based app. So this post is to document some of the challenges and hiccups.
Luckily, the OAuth 2.0 standard exists! In our case we would be looking to RFC 8414: OAuth 2.0 Authorization Server Metadata. The main point is that once we have a server URL, we can look up the configuration routes via a predictable URL /.well-known/oauth-authorization-server
If this route doesn’t exist then we have some alternatives. We could look for the instance actor.
Depending on implementation, we might find this via nodeinfo (FEP-2677), or we might find it via webfinger (FEP-d556).
This would lead us to parsing nodeinfo’s metadata field, looking for staffAccounts which would be an array, let’s just take the first one.
From there we parse the webfinger links field which is an array, looking for an object whose has rel=”self” and whose type="application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"".
Whew, this object’s href value leads us to the instance actor.
If implementations aren’t serving an oauth discovery endpoint RFC8414, and are limiting requests to actor pages, then there is really not much we can do!
@thisismissem @jesseplusplus @julian@community.nodebb.org @julian@fietkau.social @dansup that's how objects are represented in JSON-LD.
The spec is pretty explicit:
> In addition to [ActivityStreams] collections and objects, Activities may additionally be addressed to the special "public" collection, with the identifier https://www.w3.org/ns/activitystreams#Public. For example:
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://www.w3.org/ns/activitystreams#Public",
"type": "Collection"
}
```
@silverpill sure, I think it was mostly these:
Jul 02 01:40:36 wizard.casa mitra[1433501]: 2025-07-02T01:40:36 mitra_activitypub::queues [WARN] failed to process activity (HTTP status server error (502 Bad Gateway) for url (https://pubeurope.com/users/fr/statuses/114780187162115427)) (attempt #1): {"@context":"https://www.w3.org/ns/activitystreams","actor":"https://newsmast.community/users/politics","cc":["https://pubeurope.com/users/fr","https://www.w3.org/ns/activitystreams#Public"],"id":"https://newsmast.community/users/politics/statuses/114780189123638405/activity","object":"https://pubeurope.com/users/fr/statuses/114780187162115427","published":"2025-07-01T21:51:34Z","to":["https://newsmast.community/users/politics/followers"],"type":"Announce"}I'm not sure how newsmast works and I should've just maybe filtered pubeurope.com? I see newsmast cc's other instances that throw up failures like threads.net, I'll remove the filter and see what happens
@vincent The mediaType property is missing in the FEP-e232 link. Its value should be application/ld+json; profile="https://www.w3.org/ns/activitystreams": https://codeberg.org/fediverse/fep/src/branch/main/fep/e232/fep-e232.md#object-links
You might also want to add quoteUrl property, because some platforms don't support FEP-e232 links yet (e.g. Misskey).
GNU social JP is a social network, courtesy of GNU social JP管理人. It runs on GNU social, version 2.0.2-dev, available under the GNU Affero General Public License.
All GNU social JP content and data are available under the Creative Commons Attribution 3.0 license.