login service

This commit is contained in:
counterweight 2025-03-14 18:52:00 +01:00
parent 8ae4fddd12
commit add7891e94
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
2 changed files with 76 additions and 49 deletions

View file

@ -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';

View file

@ -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,
};