Verificación de MetaMask en un servidor con web3.personal.sign

¿Cómo verificar que el titular de la cuenta MetaMask es el verdadero propietario de la dirección?

Recientemente vi esta publicación y la probé de inmediato, desafortunadamente, no obtengo el resultado correcto del servidor. Creo que tiene algo que ver con el algoritmo hash sha3, pero no estoy seguro. ¿Alguien podría actualizar la solución? ¡Gracias!

Respuestas (4)

Creo que esto es lo que estás pidiendo...

Usando Web3.js 1.0 y Metamask:

Crear una firma para un mensaje:

var message = "Some string"
var hash = web3.utils.sha3(message)
var accounts = await web3.eth.getAccounts()
var signature = await web3.eth.personal.sign(hash, accounts[0])

Recuperar la dirección de un mensaje + firma:

var hash = web3.utils.sha3(message)
var signing_address = await web3.eth.personal.ecRecover(hash, signature)

Debería ver que signing_addresscoincidirá accounts[0]si está utilizando el mismo mensaje y firma en todos los ámbitos.

metamask y web3 inyectados para recuperar una cuenta ethereum por mensaje y firma

var hashCodificado = web3.fromUtf8("Autentificación en Plataforma")

        web3.personal.ecRecover(hashCodificado, "0x9b2d3a06ff7da90b629b18eaa56e150da522fa77d550d06be14049ee808ca3aa471af025c1aa40e5e11e3b42a0e033935da7b934059c1e6bebbc4f6h4486d7b51b", function (error, result) {
                if (error) alert("Necesitas identificarte para poder entrar al panel de usuario");
                if (result) {
                    alert("La cuenta que ha firmado la transaccion es: " + result)
                }
            });

Esto es lo que funciona para mí con MetaMask versión 7.1.1:

Firmando un mensaje:

var message = "Some string"
var hash = web3.sha3(message)
var account = web3.eth.accounts[0]

web3.personal.sign(hash, account, function(error, signature) {
    console.log(signature, error)
})

Obtener la dirección de la firma:

var signature = "0x..."

var message_hash = web3.sha3(message)
web3.personal.ecRecover(message_hash, signature, function(error, signing_address) {
    console.log(signing_address, error);
})
¿Cómo funciona esto en un servidor? web3.sha3 es 0.2, que es lo que inyecta MM, pero su servidor debería ejecutar 1.2+ si usa node.

He estado en un problema similar y ninguna de las respuestas funcionó para mí.

Se me ocurrió una solución que se probó para funcionar con MetaMask y WalletConnect . He publicado una respuesta detallada aquí: ¿Cómo verificar que el titular de la cuenta de MetaMask es el verdadero propietario de la dirección?