login page

This commit is contained in:
counterweight 2025-03-13 11:08:54 +01:00
parent eb1cfbb64c
commit 9dbe299a32
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
5 changed files with 85 additions and 75 deletions

View file

@ -1,72 +0,0 @@
window.onload = function () {
if (!window.nostr) {
console.log('Nostr extension not present');
document.querySelector('#login-button').disabled = true;
document.querySelector('#no-extension-nudges').style.display = 'block';
} else {
console.log('Nostr extension present');
}
};
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;
}
if (verifyResponse.status === 403) {
document.querySelector('#rejected-public-key').style.display = 'block';
}
if (verifyResponse.ok) {
document.querySelector('#sign-up-success').style.display = 'block';
setTimeout(() => {
window.location.href = '/home';
}, 1000);
}
}

81
src/front/pages/login.js Normal file
View file

@ -0,0 +1,81 @@
const loginsFunction = () => {
window.onload = function () {
if (!window.nostr) {
console.log('Nostr extension not present');
document.querySelector('#login-button').disabled = true;
document.querySelector('#no-extension-nudges').style.display = 'block';
} else {
console.log('Nostr extension present');
}
};
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;
}
if (verifyResponse.status === 403) {
document.querySelector('#rejected-public-key').style.display = 'block';
}
if (verifyResponse.ok) {
document.querySelector('#sign-up-success').style.display = 'block';
setTimeout(() => {
window.location.href = '/home';
}, 1000);
}
}
const loginButton = document.getElementById('login-button');
loginButton.addEventListener('click', () => {
login();
});
};
loginsFunction();

View file

@ -13,7 +13,7 @@
<figure> <figure>
<img class="logo" src="/img/laseca_logo_white.png" width="25%" /> <img class="logo" src="/img/laseca_logo_white.png" width="25%" />
</figure> </figure>
<form onsubmit="login();return false"> <div>
<button <button
id="login-button" id="login-button"
type="submit" type="submit"
@ -24,7 +24,7 @@
</figure> </figure>
<p>Login con Nostr</p> <p>Login con Nostr</p>
</button> </button>
</form> </div>
<div id="sign-up-success" style="display: none"> <div id="sign-up-success" style="display: none">
<p>¡Bien! Tu clave es parte de la seca.</p> <p>¡Bien! Tu clave es parte de la seca.</p>
<p>Redirigiendo a la app...</p> <p>Redirigiendo a la app...</p>
@ -86,6 +86,6 @@
</p> </p>
</div> </div>
</div> </div>
<script src="/javascript/login.js"></script> <script src="/javascript/login.bundle.js"></script>
</body> </body>
</html> </html>

View file

@ -4,6 +4,7 @@ module.exports = {
entry: { entry: {
invite: './src/front/pages/invite.js', invite: './src/front/pages/invite.js',
createProfile: './src/front/pages/createProfile.js', createProfile: './src/front/pages/createProfile.js',
login: './src/front/pages/login.js',
}, },
output: { output: {
filename: '[name].bundle.js', filename: '[name].bundle.js',