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
- Générer une URL nostrconnect://
- Vérifier que l'URL contient
name=,url=,image=comme paramètres séparés (pasmetadata=) - Tester avec une app de signature (Amber Android, nsec.app web, ou nsecBunker)
- 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 clienturl(optionnel) - l'URL canonique de l'application clientimage(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
relaypeut apparaître plusieurs fois pour plusieurs relais - Le paramètre
secretest 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, pasicon(facile à confondre avec le nom du champ metadata)