55 lines
2.1 KiB
JavaScript
55 lines
2.1 KiB
JavaScript
async function web3Login() {
|
|
console.log("Starting web3Login process...");
|
|
|
|
// Check if MetaMask is available
|
|
if (!window.ethereum) {
|
|
console.warn('MetaMask not detected.');
|
|
alert('MetaMask not detected. Please install MetaMask first.');
|
|
return { error: 'MetaMask not detected' };
|
|
}
|
|
|
|
try {
|
|
console.log("Initializing Web3 provider...");
|
|
const provider = new ethers.providers.Web3Provider(window.ethereum);
|
|
|
|
console.log("Requesting account access...");
|
|
await provider.send("eth_requestAccounts", []);
|
|
const signer = provider.getSigner();
|
|
|
|
console.log("Getting user's Ethereum address...");
|
|
const address = await signer.getAddress();
|
|
console.log(`Address: ${address}`);
|
|
|
|
console.log("Fetching unique message for signing...");
|
|
let response = await fetch('/web3-login-message');
|
|
if (!response.ok) throw new Error('Failed to fetch login message');
|
|
const message = await response.text();
|
|
console.log(`Message: ${message}`);
|
|
|
|
console.log("Requesting user to sign the message...");
|
|
const signature = await signer.signMessage(message);
|
|
console.log(`Signature: ${signature}`);
|
|
|
|
console.log("Verifying the signature on the server...");
|
|
response = await fetch('/web3-login-verify', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
|
|
},
|
|
body: JSON.stringify({ address, signature })
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorData = await response.json(); // Assuming error details are in JSON format
|
|
throw new Error(`Login verification failed: ${errorData.message || 'Unknown error'}`);
|
|
}
|
|
|
|
console.log("Web3 login process completed successfully.");
|
|
return { address, signature };
|
|
} catch (error) {
|
|
console.error('Web3 login/signature process failed:', error);
|
|
return { error: error.message };
|
|
}
|
|
}
|