From 9ed583ecdbdb8aa1fda47877efb1eee8bab85e06 Mon Sep 17 00:00:00 2001 From: counterweight Date: Tue, 11 Feb 2025 18:15:06 +0100 Subject: [PATCH] nostr challenge creation works --- src/models/NostrChallengeCreated.js | 23 ++++++++++++++ src/public/javascript/index.js | 49 ++++++++++++++++++++++++++++- src/routes/apiRoutes.js | 9 ++++++ src/services/nostrService.js | 15 +++++++++ src/views/index.ejs | 21 +++++-------- 5 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 src/models/NostrChallengeCreated.js create mode 100644 src/services/nostrService.js diff --git a/src/models/NostrChallengeCreated.js b/src/models/NostrChallengeCreated.js new file mode 100644 index 0000000..b6571f3 --- /dev/null +++ b/src/models/NostrChallengeCreated.js @@ -0,0 +1,23 @@ +const { DataTypes } = require('sequelize'); +const sequelize = require('../database'); + +const NostrChallengeCreated = sequelize.define('NostrChallengeCreated', { + uuid: { + type: DataTypes.UUID, + allowNull: false, + unique: true, + primaryKey: true + }, + challenge: { + type: DataTypes.STRING, + allowNull: false + }, + created_at: { + type: DataTypes.DATE, + allowNull: false + } +}, { + tableName: 'nostr_challenge_created' +}); + +module.exports = NostrChallengeCreated; \ No newline at end of file diff --git a/src/public/javascript/index.js b/src/public/javascript/index.js index 46188d3..5bd4670 100644 --- a/src/public/javascript/index.js +++ b/src/public/javascript/index.js @@ -1,3 +1,50 @@ +async function login() { + if (!window.nostr) { + console.log("No Nostr extension found."); + return { success: false, error: "No Nostr extension detected." }; + } + + try { + const challengeResponse = await fetch("/api/nostr-challenge"); + if (!challengeResponse.ok) throw new Error("Failed to fetch challenge"); + const { challenge } = await challengeResponse.json(); + + console.log(`Received challenge: ${challenge}`); + } catch (error) { } + /* const pubkey = await window.nostr.getPublicKey(); + + const event = { + kind: 22242, + created_at: Math.floor(Date.now() / 1000), + tags: [["challenge", challenge]], + content: "Sign this challenge to authenticate", + pubkey: pubkey + }; + + const signedEvent = await window.nostr.signEvent(event); + + const verifyResponse = await fetch("/api/nostr-verify", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(signedEvent), + }); + + if (!verifyResponse.ok) throw new Error("Verification failed"); + const verifyResult = await verifyResponse.json(); + + if (verifyResult.success) { + console.log("Authentication successful!"); + return { success: true, pubkey }; + } else { + throw new Error("Invalid signature"); + } + } catch (error) { + console.error("Error during Nostr authentication:", error.message); + return { success: false, error: error.message }; + } */ +} + +/* window.onload = function () { setTimeout(function () { console.log("This code runs 2 seconds after the window has loaded."); @@ -35,4 +82,4 @@ window.onload = function () { ) }, 2000); -} \ No newline at end of file +} */ \ No newline at end of file diff --git a/src/routes/apiRoutes.js b/src/routes/apiRoutes.js index 55a3e01..a87a45a 100644 --- a/src/routes/apiRoutes.js +++ b/src/routes/apiRoutes.js @@ -1,8 +1,11 @@ const express = require('express'); +//const { generatePrivateKey, getPublicKey, verifySignature } = require("nostr-tools"); +const crypto = require("crypto"); const appInviteService = require('../services/appInviteService'); const invitedNpubService = require('../services/invitedNpubService'); const sessionService = require('../services/sessionService'); +const nostrService = require('../services/nostrService'); const router = express.Router(); @@ -55,4 +58,10 @@ router.post('/invited-npub', async (req, res) => { }); + +router.get('/nostr-challenge', async (req, res) => { + const nostrChallenge = await nostrService.createNostrChallenge(); + res.json({ 'challenge': nostrChallenge.challenge }); +}); + module.exports = router; diff --git a/src/services/nostrService.js b/src/services/nostrService.js new file mode 100644 index 0000000..110027d --- /dev/null +++ b/src/services/nostrService.js @@ -0,0 +1,15 @@ +const uuid = require("uuid"); +const crypto = require("crypto"); + +const NostrChallengeCreated = require('../models/NostrChallengeCreated'); + +async function createNostrChallenge() { + const nostrChallenge = await NostrChallengeCreated.create({ + 'uuid': uuid.v7(), + challenge: crypto.randomBytes(32).toString("hex"), + created_at: new Date().toISOString() + }); + return nostrChallenge; +} + +exports.createNostrChallenge = createNostrChallenge; \ No newline at end of file diff --git a/src/views/index.ejs b/src/views/index.ejs index 7cbfaff..da6e956 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -9,20 +9,15 @@ -

Hello World! We're live

-

Now this is some production grade stuff, baby!

-

Your session's UUID: <%= uuid %> +

Bienvenido a la seca

+

Usa Nostr para logearte

+
+ +
+

+ ¿No tienes cuenta de Nostr? Crea una + gratis.

- -
-

Here's a kitty, cause why not

- - - \ No newline at end of file