story-research-zapwall/fixKnowledge/nostrcheck-me-authentication.md

129 lines
4.9 KiB
Markdown

# Authentification pour nostrcheck.me API
## Date
2025-01-27
## Problème
L'endpoint `https://nostrcheck.me/api/v1/media` retourne une erreur 401 Unauthorized lors des tentatives d'upload, indiquant qu'une authentification est requise.
## Symptômes
- Erreur 401 lors des appels à `/api/nip95-upload?endpoint=https://nostrcheck.me/api/v1/media`
- Message d'erreur : `{"result":false,"description":"Authorization header not found"}`
- Les uploads vers nostrcheck.me échouent systématiquement
## Recherche effectuée
### Informations trouvées sur nostrcheck.me
1. **Authentification du site web** :
- Support de NIP-07 (extensions de navigateur comme Alby)
- Code à usage unique envoyé via message direct Nostr lors de l'inscription
- Nécessite la création d'un compte sur nostrcheck.me
2. **Services offerts** :
- Enregistrement d'adresses Nostr (NIP-05)
- Hébergement de médias
- Galeries privées et publiques
- Relais privé
3. **API d'upload** :
- Endpoint : `https://nostrcheck.me/api/v1/media`
- Nécessite un header `Authorization`
- Format du header non documenté publiquement
### NIP-98 (HTTP Auth pour Nostr)
NIP-98 est le standard d'authentification HTTP pour Nostr. Il permet d'authentifier des requêtes HTTP en signant un événement Nostr qui contient :
- La méthode HTTP (POST)
- L'URL de la requête
- Le hash du body (optionnel)
- Un timestamp
Le header `Authorization` devrait contenir un token au format NIP-98, généralement :
```
Authorization: Nostr <base64-encoded-event>
```
## Hypothèses
1. **NIP-98 requis** : nostrcheck.me utilise probablement NIP-98 pour l'authentification de l'API
2. **Compte requis** : Un compte doit être créé sur nostrcheck.me avant d'utiliser l'API
3. **Signature d'événement** : Il faut probablement signer un événement Nostr avec la clé privée de l'utilisateur pour générer le token d'authentification
## À explorer
### 1. Documentation de l'API nostrcheck.me
- Vérifier s'il existe une documentation publique de l'API
- Contacter le support de nostrcheck.me pour obtenir les spécifications
- Examiner le code source si disponible
### 2. Implémentation de NIP-98
Si NIP-98 est requis, il faut :
- Créer une fonction pour générer un événement d'authentification NIP-98
- Signer cet événement avec la clé privée de l'utilisateur (via Alby ou clé locale)
- Encoder l'événement signé en base64
- Ajouter le header `Authorization: Nostr <token>` aux requêtes
### 3. Format de l'événement NIP-98
L'événement devrait contenir :
- `kind`: Probablement un kind spécifique pour l'authentification HTTP
- `tags`: Tags avec la méthode HTTP, l'URL, etc.
- `content`: Vide ou contenant des métadonnées
- `created_at`: Timestamp actuel
- `pubkey`: Clé publique de l'utilisateur
- `sig`: Signature de l'événement
### 4. Intégration dans l'API proxy
Modifier `pages/api/nip95-upload.ts` pour :
- Détecter si l'endpoint est nostrcheck.me
- Générer un token NIP-98 si l'utilisateur est authentifié
- Ajouter le header Authorization à la requête
## Code existant disponible
Le projet dispose déjà de :
- `lib/nostrRemoteSigner.ts` : Service de signature d'événements Nostr
- `lib/nostrAuth.ts` : Service d'authentification Nostr
- Support de NIP-07 via Alby extension
- Gestion des clés privées (stockage chiffré)
## Implémentation réalisée
**NIP-98 implémenté** (2025-01-27)
1. **Création de `lib/nip98.ts`** :
- Fonction `generateNip98Token()` pour générer le token d'authentification
- Support de la signature via `nostrRemoteSigner` (Alby/nos2x)
- Encodage base64 de l'événement signé
2. **Intégration dans `lib/nip95.ts`** :
- Détection automatique de nostrcheck.me
- Génération du token NIP-98 avant l'upload
- Passage du token à l'API proxy
3. **Support dans `pages/api/nip95-upload.ts`** :
- Récupération du token depuis les paramètres de requête
- Ajout du header `Authorization: Nostr <token>`
- Préservation du token lors des redirections
## Utilisation
Pour utiliser nostrcheck.me :
1. Créer un compte sur nostrcheck.me avec la même clé Nostr (via nos2x, Alby, etc.)
2. Se connecter à l'application avec la même extension/clé
3. Activer nostrcheck.me dans les settings (`/settings`)
4. L'upload vers nostrcheck.me fonctionnera automatiquement avec l'authentification NIP-98
## Notes
- L'authentification NIP-98 nécessite que l'utilisateur soit connecté avec Alby ou ait une clé privée disponible
- Le token doit être généré côté client (navigateur) car il nécessite la clé privée
- L'API proxy côté serveur ne peut pas générer le token sans avoir accès à la clé privée de l'utilisateur
- Solution possible : Générer le token côté client et le passer en paramètre à l'API proxy
## Références
- nostrcheck.me : https://nostrcheck.me/
- NIP-07 : https://github.com/nostr-protocol/nips/blob/master/07.md
- NIP-98 : À rechercher dans le repository des NIPs