Autenticación de API web JSON

Consulte la información de la sección /auth en la documentación de WebAPI para obtener detalles completos sobre los métodos de autenticación de la WebAPI del medidor eGauge.

La WebAPI de eGauge utiliza autenticación mediante token web JSON (JWT) para todas las interacciones. Se debe proporcionar un encabezado "Autorización" en las solicitudes WebAPI con el formato Authorization: Bearer JWT donde JWT es un token web JSON válido.

Los tokens normalmente caducan después de 10 minutos y deben renovarse periódicamente.

Hay dos métodos para obtener un token:

  • Objeto Digest: Este es el método recomendado para obtener un JWT y se describe en este documento. Es similar al método de autenticación HTTP Digest.
  • Objeto de contraseña: Este método envía las credenciales como texto plano y, por lo tanto, requiere una conexión segura, por ejemplo, HTTPS a la dirección IP local del medidor. Este método devolverá un error si se intenta a través del servidor proxy de eGauge, incluso si se utiliza HTTPS.


Puede encontrar más información sobre los métodos de autenticación haciendo clic en el objeto que desea utilizar en la sección /auth de la documentación de WebAPI:

Ejemplo: utilice el panel de navegación a la izquierda para expandir los menús de los puntos finales

Flujo de trabajo de autenticación de resumen


Paso 1: Envíe un GET a /auth/unauthorized para obtener un 401 para obtener el dominio ( rlm ) y el nonce del servidor ( nnc )

Paso 2: Generar un nonce de cliente ( cnnc )

Paso 3: Calcula el hash en el formato:

ha1 = MD5(usr:rlm:pwd)
hash = MD5(ha1:nnc:cnnc)
donde usr y pwd son un usuario y contraseña válidos en el medidor.

Paso 4: Envíe rlm , usr , nnc , cnnc y hash a /auth/login para obtener el token

Autenticación implícita en Python

eGauge Systems proporciona una biblioteca de Python con funciones auxiliares para gestionar la autenticación y otras interacciones. Consulte la página de introducción a WebAPI para obtener más información.

#!/usr/bin/env python3
# Example Python script obtaining a JSON web token (JWT) from a meter's WebAPI.
# JWTs are needed for any interactions with the meter's JSON-based WebAPI.
# eGauge provides a Python library that handles authentication automatically and
# provides additional helper functions. It may be found on Bitbucket or PyPi
# https://bitbucket.org/egauge/python/src/master/egauge/
# https://pypi.org/project/egauge-python/
# Main WebAPI documentation: https://egauge.net/support/webapi
import requests
import hashlib
from secrets import token_hex
# meter and credential information
URI = "https://eGauge67385.d.egauge.net"
USER = "admin"
PASS = "as$kS2345da2@4vK9"

# get realm (rlm) and server nonce (nnc):
auth_req = requests.get(f"{URI}/api/auth/unauthorized").json()
realm = auth_req["rlm"]
nnc = auth_req["nnc"]
cnnc = str(token_hex(64)) # generate a client nonce (cnnc)
# generate our hash
# ha1 = MD5(usr:rlm:pwd)
# hash = MD5(ha1:nnc:cnnc)
ha1_content = f"{USER}:{realm}:{PASS}"
ha1 = hashlib.md5(ha1_content.encode("utf-8")).hexdigest()
hash_content = f"{ha1}:{nnc}:{cnnc}"
hash = hashlib.md5(hash_content.encode("utf-8")).hexdigest()
# Generate our payload
payload = {
   "rlm": realm,
   "usr": USER,
   "nnc": nnc,
   "cnnc": cnnc,
   "hash": hash
}
# POST to /auth/login to get a JWT
auth_login = requests.post(f"{URI}/api/auth/login", json=payload).json()
rights = auth_login["rights"] # rights this token has (save, control, etc)
jwt = auth_login["jwt"] # the actual bearer token
print(f"Got token with rights {rights}.")
# We can verify this token works.
# Add an authorization header with our token and make a request
headers = {"Authorization": f"Bearer {jwt}"}
api_request = requests.get(
   f"{URI}/api/config/net/hostname",
   headers=headers,
)
# {'result': 'eGauge67385'}
print(api_request.json())
# This token may be used until it expires, in which case a 401 response will be
# returned, to which this process can be reperformed.

Autenticación de resumen con Bash

Este script bash usa curl y jq para obtener un JWT para usar con WebAPI.

URI="https://eGauge67385.d.egauge.net"
USER="admin"
PASS="as$kS2345da2@4vK9"
auth_req=$(curl -s "$URI/api/auth/unauthorized")
rlm=$(jq -r '.rlm' <<< $auth_req)
nnc=$(jq -r '.nnc' <<< $auth_req)
cnnc=$(openssl rand -hex 64)
ha1=$(echo -n "$USER:$rlm:$PASS" | md5sum | cut -f1 -d" ")
hash=$(echo -n "$ha1:$nnc:$cnnc" | md5sum | cut -f1 -d" ")
auth_login=$(curl -s -X POST "$URI/api/auth/login" \
    -H "Content-Type: application/json" \
    -d "{\"rlm\": \"$rlm\", \"usr\": \"$USER\", \"nnc\": \"$nnc\", \"cnnc\": \"$cnnc\", \"hash\": \"$hash\"}")
jwt=$(jq -r '.jwt' <<< $auth_login)
api_request=$(curl -s "$URI/api/config/net/hostname" -H "Authorization: Bearer $jwt")
echo $api_request