nip46-nostrconnect-url-params

Par divinevideo · divine-mobile

Correction des URLs `nostrconnect://` NIP-46 non reconnues par les applications de signature (Amber, nsec.app, nsecBunker). À utiliser quand : (1) le QR code ou le collage d'URL échoue dans l'application de signature malgré une URL valide en apparence, (2) utilisation d'un objet JSON `metadata` au lieu de paramètres de requête séparés, (3) implémentation de connexions NIP-46 initiées par le client. La spécification NIP-46 exige que `name`/`url`/`image` soient des paramètres de requête séparés, et non un objet JSON `metadata`.

npx skills add https://github.com/divinevideo/divine-mobile --skill nip46-nostrconnect-url-params

Format du paramètre URL nostrconnect:// NIP-46

Problème

Lors de l'implémentation de connexions initiées par le client NIP-46 (nostrconnect://), les apps de signature peuvent ne pas reconnaître l'URL si les métadonnées de l'app sont transmises sous forme d'objet JSON au lieu de paramètres de requête séparés.

Contexte / Conditions déclenchantes

  • L'app de signature (Amber, nsec.app, nsecBunker) affiche une erreur ou échoue silencieusement lors du scan/collage d'URL
  • L'URL contient le format metadata={"name":"...","url":"..."}
  • Le code QR se génère correctement mais le signataire ne se connecte pas
  • Les autres paramètres (relay, secret, perms) semblent corrects

Solution

Incorrect (objet JSON metadata) :

nostrconnect://<pubkey>?relay=wss://relay.example.com&secret=abc123&metadata={"name":"MyApp","url":"https://myapp.com","icon":"https://myapp.com/icon.png"}&perms=sign_event

Correct (paramètres séparés selon NIP-46) :

nostrconnect://<pubkey>?relay=wss://relay.example.com&secret=abc123&name=MyApp&url=https://myapp.com&image=https://myapp.com/icon.png&perms=sign_event

Exemple de correction de code (Dart) :

// INCORRECT - Ne pas regrouper dans JSON metadata
if (metadata.isNotEmpty) {
  final metadataJson = jsonEncode(metadata);
  params.add('metadata=${Uri.encodeComponent(metadataJson)}');
}

// CORRECT - Utiliser des paramètres séparés selon NIP-46
if (appName != null && appName.isNotEmpty) {
  params.add('name=${Uri.encodeComponent(appName)}');
}
if (appUrl != null && appUrl.isNotEmpty) {
  params.add('url=${Uri.encodeComponent(appUrl)}');
}
if (appIcon != null && appIcon.isNotEmpty) {
  params.add('image=${Uri.encodeComponent(appIcon)}');
}

Vérification

  1. Générer une URL nostrconnect://
  2. Vérifier que l'URL contient name=, url=, image= comme paramètres séparés (pas metadata=)
  3. Tester avec une app de signature (Amber Android, nsec.app web, ou nsecBunker)
  4. Le signataire devrait afficher le nom de l'app et demander une approbation

Référence de la spécification NIP-46

D'après NIP-46 :

Des informations supplémentaires doivent être transmises sous forme de paramètres de requête :

  • name (optionnel) - le nom de l'application client
  • url (optionnel) - l'URL canonique de l'application client
  • image (optionnel) - une petite image représentant l'application client

La spécification ne mentionne PAS de paramètre metadata - chaque champ est un paramètre de requête séparé.

Notes

  • Tous les paramètres de requête doivent être encodés en URL
  • Le paramètre relay peut apparaître plusieurs fois pour plusieurs relais
  • Le paramètre secret est REQUIS pour nostrconnect:// (pas optionnel comme bunker://)
  • Certaines apps de signature peuvent être plus flexibles que d'autres - toujours suivre exactement la spécification
  • Noter que le paramètre est image, pas icon (facile à confondre avec le nom du champ metadata)

Références

Skills similaires