Files

89 lines
3.6 KiB
Markdown

NIP-39
======
Linking Profiles to Other Platforms
-----------------------------------
`draft` `optional`
## Abstract
Users can declare their control over one or more online identities such as usernames, profile pages, keypairs in kind `10011` using `i` tags.
```yaml
{
"kind": 10011,
"tags": [
["i", "github:semisol", "9721ce4ee4fceb91c9711ca2a6c9a5ab"],
["i", "twitter:semisol_public", "1619358434134196225"],
["i", "mastodon:bitcoinhackers.org/@semisol", "109775066355589974"],
["i", "telegram:1087295469", "nostrdirectory/770"]
],
// other fields...
}
```
An `i` tag MUST have two parameters, which are defined as the following:
1. `platform:identity`: This is the platform name (for example `github`) and the identity on that platform (for example `semisol`) joined together with `:`.
2. `proof`: String or object that points to the proof of owning this identity.
Clients SHOULD process any `i` tags with more than 2 values for future extensibility.
Identity provider names SHOULD only include `a-z`, `0-9` and the characters `._-/` and MUST NOT include `:`.
Identity names SHOULD be normalized if possible by replacing uppercase letters with lowercase letters, and if there are multiple aliases for an entity the primary one should be used.
## Verification text
For every claim type, the proof SHOULD have the text:
```
Verifying that I control the following Nostr public key: <npub encoded public key>
```
Clients verifying a claim SHOULD accept any proof published by `<identity>` that contains the user's npub, because proofs created under earlier versions of this NIP use different text.
## Claim types
### `github`
Identity: A GitHub username.
Proof: A GitHub Gist ID. This Gist should be created by `<identity>` with a single file that has the [verification text](#verification-text).
This can be located at `https://gist.github.com/<identity>/<proof>`.
### `twitter`
Identity: A Twitter username.
Proof: A Tweet ID. The tweet should be posted by `<identity>` and have the [verification text](#verification-text).
This can be located at `https://twitter.com/<identity>/status/<proof>`.
### `mastodon`
Identity: A Mastodon instance and username in the format `<instance>/@<username>`.
Proof: A Mastodon post ID. This post should be published by `<username>@<instance>` and have the [verification text](#verification-text).
This can be located at `https://<identity>/<proof>`.
### `telegram`
Identity: A Telegram user ID.
Proof: A string in the format `<ref>/<id>` which points to a message published in the public channel or group with name `<ref>` and message ID `<id>`. This message should be sent by user ID `<identity>` and have the [verification text](#verification-text).
This can be located at `https://t.me/<proof>`.
### `bluesky`
Identity: A Bluesky handle, without the leading `@` (for example `alice.bsky.social`).
Proof: The record key of a Bluesky post. This post should be published by `<identity>` and have the [verification text](#verification-text).
This can be located at `https://bsky.app/profile/<identity>/post/<proof>`.
### `discord`
Identity: A Discord username.
Proof: A string in the format `<guild>/<channel>/<message>` which points to a message with ID `<message>` in the channel with ID `<channel>` of the server with ID `<guild>`. This message should be sent by `<identity>` and have the [verification text](#verification-text).
This can be located at `https://discord.com/channels/<proof>`.
Discord messages can only be read by members of the server they were posted in, so clients that cannot access the server will not be able to verify this claim.