Función para validar PubKey de Hive y usarla en un sistema de autenticación como Keychain

in #spanish5 months ago

hivedev.png


¡Hola, Hivers desarrolladores de la comunidad hispana! Hoy quiero compartir con ustedes una función para validar si una clave pública está asociada a un nombre de usuario en Hive.

Esta función se puede utilizar en cualquier otra que requiera validar el ingreso de un usuario a una aplicación. Por ejemplo, puedes emplearla junto con Keychain, si necesitas validar la información después de que el usuario ingrese y necesites dar acceso a una aplicación.

Análisis de Códigos

Entradas:

key: Una cadena que representa la clave pública a verificar.
Hive username: Una cadena que representa el nombre de usuario que debe verificarse con la clave pública.

Flujo:

  • Construir una carga útil de solicitud JSON-RPC con la clave pública y el nombre de usuario proporcionado.
  • Comprobar si el nombre de usuario está asociado a la clave pública en la respuesta.
  • Retornar True si se encuentra el nombre de usuario; de lo contrario, Retornar False.

Salida:

  • Lanza un error si ninguna de las API responde correctamente.
  • Esta función es útil para autenticar usuarios en aplicaciones que utilizan la blockchain de Hive, comprobando si una clave pública dada está realmente asociada con un nombre de usuario específico en la blockchain.

Yo uso Fetch para hacer la petición en TS:

const apiUrls = [
  "https://api.hive.blog",
  "https://anyx.io",
  "https://api.openhive.network",
  "https://rpc.mahdiyari.info",
  "https://api.deathwing.me",
  "https://hive-api.3speak.tv",
];

async function checkPubkey(key: string, username: string): Promise<boolean> {
  const data = {
    jsonrpc: "2.0",
    method: "account_by_key_api.get_key_references",
    params: { keys: [key] },
    id: 1,
  };

  for (const apiUrl of apiUrls) {
    try {
      const response = await fetch(apiUrl, {
        method: "POST",
        body: JSON.stringify(data),
        headers: { "Content-Type": "application/json" },
      });

      if (!response.ok) {
        console.warn(
          `HTTP error! status: ${response.status} for URL: ${apiUrl}`
        );
        continue;
      }

      const json = await response.json();
      const findAccount = json.result.accounts[0]?.includes(username);

      return findAccount ?? false;
    } catch (error) {
      console.error(`Error al realizar la solicitud a ${apiUrl}:`, error);
    }
  }

  throw new Error(
    "No se pudo realizar la solicitud en ninguna de las APIs disponibles."
  );
}

export { checkPubkey };


En Python sería así usando requests:

import requests

def verify_hive_user(public_key, username):
    url = 'https://api.hive.blog'
    payload = {
        'jsonrpc': '2.0',
        'method': 'account_by_key_api.get_key_references',
        'params': {
            'keys': [public_key]
        },
        'id': 1
    }
    
    try:
        response = requests.post(url, json=payload)
        response.raise_for_status()  
        data = response.json()
        
        accounts = data.get('result', {}).get('accounts', [])
        
        return any(account[0] == username for account in accounts)
    except requests.RequestException as error:
        raise ValueError('Error verificando el usuario en Hive:', error)

# Ejemplo de uso
public_key = 'STM7qDF7hhEmQeq4JzS9oRQnfvfsqJPUN6wZwyMbSUDiG8JhtkJx2'
username = 'enrique89'
print(verify_hive_user(public_key, username))



Prueba estas funciones en tus aplicaciones y puedes mejorar el código.

Saludos.

Sort:  

Justo lo que necesitaba para la miniaplicación de Telegram, pronto....., Gracias Miles!!!
-> https://t.me/HiveCuBaP2P_Bot

Congratulations @enrique89! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)

You distributed more than 73000 upvotes.
Your next target is to reach 74000 upvotes.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP