Firma De Mensajes

Firma mensajes de autenticacion o propiedad sin crear transacciones on-chain.

La firma de mensajes demuestra el control de una wallet sobre un mensaje off-chain. No autoriza cambios de estado on-chain y no es una firma de transaccion.

Usa la firma de mensajes para desafios de autenticacion, comprobaciones de propiedad de cuenta o textos de consentimiento que tu aplicacion verifica fuera de la cadena.

Firma De Mensajes En Vue

<script setup lang="ts">
import { computed } from "vue";
import { useSignMessage } from "@vue-solana/vue/useSignMessage";
import { useWallet } from "@vue-solana/vue/useWallet";

const { connected, canSignMessage } = useWallet();
const { signature, status, error, execute } = useSignMessage();

const canSign = computed(() => connected.value && canSignMessage.value);

async function signIn() {
  const message = new TextEncoder().encode("Iniciar sesion en example.com");
  await execute(message);
}
</script>

<template>
  <section>
    <button type="button" :disabled="!canSign" @click="signIn">Firmar mensaje</button>
    <p>Estado: {{ status }}</p>
    <p v-if="signature">Bytes de la firma: {{ signature.length }}</p>
    <p v-if="error">No se pudo firmar el mensaje.</p>
  </section>
</template>

Las wallets que no exponen firma de mensajes reportan canSignMessage como false. Llamar a execute() sin soporte rechaza con WALLET_FEATURE_UNSUPPORTED.

Firma De Mensajes En Nuxt

Nuxt autoimporta useSolanaSignMessage() y useSolanaWallet().

<script setup lang="ts">
const { connected, canSignMessage } = useSolanaWallet();
const { signature, status, error, execute } = useSolanaSignMessage();

async function signChallenge() {
  await execute(new TextEncoder().encode("Iniciar sesion en mi app Nuxt"));
}
</script>

Solo llama a la firma de mensajes desde acciones del usuario en el cliente.

Texto Del Desafio

Usa un texto de desafio claro y especifico de la aplicacion. Los usuarios deben entender lo que estan firmando.

Un buen texto de desafio normalmente incluye:

  • Nombre de la app o dominio.
  • Proposito de la firma.
  • Nonce o valor de desafio de un solo uso.
  • Hora de emision y hora de expiracion.

Ejemplo:

Iniciar sesion en example.com
Wallet: 8Y...abc
Nonce: 7f4b3c
Emitido En: 2026-07-02T12:00:00Z
Expira En: 2026-07-02T12:10:00Z

Limite De Verificacion

Vue Solana ayuda a solicitar la firma a la wallet. Tu aplicacion es responsable de la verificacion del lado del servidor, el almacenamiento de nonces, las comprobaciones de expiracion y la creacion de sesiones.

No trates una firma sobre texto generico como permiso para transferir tokens o cambiar estado on-chain.

Manejo De Errores

Los errores de firma de mensajes usan el mismo modelo normalizado SolanaError que los helpers de wallets y transacciones.

const message = computed(() => {
  switch (error.value?.code) {
    case "NO_WALLET_SELECTED":
      return "Elige una wallet primero.";
    case "WALLET_NOT_CONNECTED":
      return "Conecta tu wallet primero.";
    case "WALLET_FEATURE_UNSUPPORTED":
      return "Esta wallet no admite firma de mensajes.";
    case "USER_REJECTED":
      return "La firma del mensaje fue rechazada.";
    default:
      return null;
  }
});

Lista De Seguridad

  • Usa nonces de un solo uso para desafios de autenticacion.
  • Haz que los desafios expiren rapidamente.
  • Verifica las firmas en el servidor antes de crear una sesion.
  • Haz que el texto firmado sea legible para humanos.
  • Nunca sugieras que la firma de mensajes envia una transaccion.
  • Nunca reutilices un flujo de firma de transacciones para texto de autenticacion.