diff --git a/src/front/pages/login.js b/src/front/pages/login.js index 752c376..cf5fb92 100644 --- a/src/front/pages/login.js +++ b/src/front/pages/login.js @@ -1,6 +1,9 @@ const checkNostrExtension = require('../utils/checkNostrExtension'); +const loginService = require('../services/loginService'); const loginsFunction = () => { + const rejectedNostrWarning = document.querySelector('#rejected-nostr-nudges'); + window.onload = () => { checkNostrExtension( window, @@ -16,55 +19,14 @@ const loginsFunction = () => { }; async function login() { - let challengeResponse; - try { - challengeResponse = await fetch('/api/login/nostr-challenge', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - } catch (error) { - console.log(`Something went wrong: ${error}`); - return; - } - - const { challenge } = await challengeResponse.json(); - - let pubkey; - try { - pubkey = await window.nostr.getPublicKey(); - } catch (error) { - document.querySelector('#rejected-nostr-nudges').style.display = 'block'; - return; - } - const event = { - kind: 22242, - created_at: Math.floor(Date.now() / 1000), - tags: [['challenge', challenge]], - content: 'Sign this challenge to authenticate', - pubkey: pubkey, - }; - - let signedEvent; - try { - signedEvent = await window.nostr.signEvent(event); - } catch (error) { - document.querySelector('#rejected-nostr-nudges').style.display = 'block'; - return; - } - - let verifyResponse; - try { - verifyResponse = await fetch('/api/login/nostr-verify', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(signedEvent), - }); - } catch (error) { - console.log(`Something went wrong: ${error}`); - return; - } + const verifyResponse = await loginService.requestAndRespondLoginChallenge({ + onRejectedPubKeyCallback: () => { + rejectedNostrWarning.style.display = 'block'; + }, + onRejectedSignatureCallback: () => { + rejectedNostrWarning.style.display = 'block'; + }, + }); if (verifyResponse.status === 403) { document.querySelector('#rejected-public-key').style.display = 'block'; diff --git a/src/front/services/loginService.js b/src/front/services/loginService.js new file mode 100644 index 0000000..d1f5815 --- /dev/null +++ b/src/front/services/loginService.js @@ -0,0 +1,65 @@ +const requestAndRespondLoginChallenge = async ({ + onRejectedPubKeyCallback, + onRejectedSignatureCallback, +}) => { + onRejectedPubKeyCallback = () => { + document.querySelector('#rejected-nostr-nudges').style.display = 'block'; + }; + onRejectedSignatureCallback = onRejectedPubKeyCallback; + + let challengeResponse; + try { + challengeResponse = await fetch('/api/login/nostr-challenge', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + } catch (error) { + console.log(`Something went wrong: ${error}`); + return; + } + + const { challenge } = await challengeResponse.json(); + + let pubkey; + try { + pubkey = await window.nostr.getPublicKey(); + } catch (error) { + onRejectedPubKeyCallback(); + return; + } + const event = { + kind: 22242, + created_at: Math.floor(Date.now() / 1000), + tags: [['challenge', challenge]], + content: 'Sign this challenge to authenticate', + pubkey: pubkey, + }; + + let signedEvent; + try { + signedEvent = await window.nostr.signEvent(event); + } catch (error) { + onRejectedSignatureCallback(); + return; + } + + let verifyResponse; + try { + verifyResponse = await fetch('/api/login/nostr-verify', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(signedEvent), + }); + } catch (error) { + console.log(`Something went wrong: ${error}`); + return; + } + + return verifyResponse; +}; + +module.exports = { + requestAndRespondLoginChallenge, +};