如何实现NIP-05规范下nostr.json的安全GET请求响应?
NIP-05 接口最佳实现方案
根据NIP-05(将Nostr密钥映射到基于DNS的互联网标识符)的要求,我们需要实现一个能处理GET请求的接口,仅当请求的name存在时返回对应JSON数据,否则返回错误。以下是具体实现思路和代码示例:
核心逻辑步骤
- 接收GET请求,解析URL中的
name查询参数 - 参数校验:
- 若缺少
name参数,返回{"error":"Missing name parameter"} - 若
name不在预设的用户列表中,返回{"error":"user not found"} - 若
name存在,提取该用户的公钥及对应的中继地址,构造符合要求的JSON响应返回
- 若缺少
推荐实现(Node.js + Express)
1. 初始化项目并安装依赖
npm init -y npm install express fs path
2. 编写核心代码
创建server.js文件:
const express = require('express'); const fs = require('fs'); const path = require('path'); const app = express(); const PORT = process.env.PORT || 3000; // 读取本地nostr.json文件 const nostrData = JSON.parse(fs.readFileSync(path.join(__dirname, 'nostr.json'), 'utf8')); // 处理.well-known/nostr.json请求 app.get('/.well-known/nostr.json', (req, res) => { res.setHeader('Content-Type', 'application/json'); const name = req.query.name; // 缺少name参数 if (!name) { return res.status(400).json({ error: 'Missing name parameter' }); } // 检查name是否存在 const pubkey = nostrData.names[name]; if (!pubkey) { return res.status(404).json({ error: 'user not found' }); } // 构造响应数据 const response = { names: { [name]: pubkey }, relays: { [pubkey]: nostrData.relays[pubkey] || [] } }; res.json(response); }); app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
3. 放置nostr.json文件
将你的nostr.json文件放在项目根目录下,结构如下:
{ "names": { "user_name_1": "user_pubkey_1", "user_name_2": "user_pubkey_2" }, "relays": { "user_pubkey_1": [ "wss://relay1", "wss://relay2" ], "user_pubkey_2": [ "wss://relay3", "wss://relay4" ] } }
其他注意事项
- 若你的部署环境是静态托管(如GitHub Pages),无法直接处理动态请求,建议改用Serverless函数(如Vercel Functions、Netlify Functions)实现相同逻辑
- 可根据需求将用户数据从文件迁移到数据库(如SQLite、PostgreSQL),方便批量管理用户
- 注意设置正确的CORS头,避免跨域请求问题
内容的提问来源于stack exchange,提问作者qpaycm
相关产品推荐
相关产品推荐

