Authentication Chain
Muchas acciones en el protocolo Decentraland requieren o se benefician de la autorización con una firma de la cuenta de Ethereum del usuario. Por ejemplo:
Subir una nueva versión de cualquier Entity que poseen (como su perfil).
Autenticarse ante servicios de terceros.
Autorizar delegados para actuar en su nombre.
Para realizar estas acciones, los usuarios y delegados deben firmar cargas útiles que describan su intención y producir un auth chain.
Introducción
Las cadenas de autenticación encapsulan una serie de pasos de verificación, donde cada paso depende de la verificación exitosa del anterior. Todos los pasos deben considerarse válidos por el verificador para que se realice cualquier acción restringida.
Cada cadena comienza identificando al usuario y termina con una carga útil firmada que representa la acción solicitada. La cadena más pequeña contiene así dos elementos, que indican:
1. La autoridad es la cuenta de Ethereum <user-address>
2. La carga útil es <payload>, autorizada por <user-signature>Esta cadena básica puede evaluarse verificando que la clave pública de la firma corresponde con la dirección. En este caso, es equivalente a una firma simple.
Cuando los usuarios autorizan delegados para actuar en su nombre, aparecen pasos intermedios en la cadena. Por ejemplo, una cadena con una sola delegación indicaría:
1. La autoridad es la cuenta de Ethereum <user-address>
2. El delegado es <delegate-address>, autorizado por <user-signature> hasta <date>
3. La carga útil es <payload>, autorizada por <delegate-signature>Las cadenas son más largas cuando los delegados autorizan a sus propios delegados. En otras palabras, la autorización es transitiva.
Puedes pensar en las cadenas de autenticación como análogas a las cadenas de certificados TLS utilizadas en HTTPS, con el usuario como equivalente de la autoridad raíz.
Esta cadena de un solo delegado es la forma de autorización más común usada en Decentraland, ya que los usuarios autorizan una clave para su World Explorer para evitar tener que firmar cada acción individual con su cuenta de Ethereum.
Construcción de una Cadena
Cada paso en la cadena de autenticación contiene tres piezas de información: un type, un payload y una correspondiente firma.
type
El nombre de un tipo (ver más abajo).
payload
Una cadena dependiente del tipo.
firma
La firma Ethereum codificada en hex del payload, comenzando con 0x.
Dado que la serialización más común de una cadena de autenticación es un arreglo JSON, los ejemplos abajo se presentan en esa forma. Ver Transmisión de una Cadena para más detalles.
Primer Paso: Identificación
El primer paso, que identifica la autoridad original (es decir, el usuario), debe cumplir estas condiciones:
El
typeesSIGNEREl
payloades la cuenta de Ethereum codificada.El
firmaestá vacío.
Por ejemplo:
El segundo paso debe llevar una firma de esta cuenta para su payload.
Pasos Intermedios: Delegación
Cuando los delegados actúan en nombre del usuario, se agrega un elemento en el medio de la cadena por cada uno de ellos. Las condiciones para estos pasos son:
El tipo es
ECDSA_EPHEMERALEl
payloades un texto especialmente elaborado (ver más abajo).
El payload está diseñado para ser fácil de leer y fácil de analizar, ya que tanto humanos (cuando usan la interfaz de su wallet) como programas (cuando lo crean y validan) deben trabajar con él. Contiene exactamente 3 líneas de texto plano sensible a mayúsculas:
Por ejemplo, esta es una carga útil típica usada por World Explorers durante el inicio de sesión, cuando generan su clave delegada temporal para que el usuario la apruebe:
Nótese que:
El
Dirección efímerano necesita ser una cuenta de Ethereum real con fondos en la blockchain. El campo puede representar únicamente una clave pública temporal.El
Expiraciónes una fecha y hora serializada en ISO-8601 formato. No necesita ser UTC.La clave delegada debe renovarse periódicamente con una firma nueva del usuario, debido a esta fecha de expiración.
Es práctica estándar (y muy recomendable) generar una nueva clave en cada renovación (de ahí el nombre ECDSA_EPHEMERAL).
Un ejemplo de paso de delegación (valores abreviados para mayor claridad):
El siguiente paso, ya sea otra delegación o la autorización final, lleva una firma de la clave de este delegado.
Último Paso: Autorización
Después de que el SIGNER haya sido especificado y todas las ECDSA_EPHEMERAL claves delegadas fueron validadas verificando la cadena de firmas intermedias, el paso final es la acción real que necesita ser autorizada.
El payload depende del type del paso. Por ejemplo, si un usuario está subiendo un nuevo perfil (o cualquier entity que posea) a un servidor de contenido, el último elemento tendrá esta forma:
Si esta última firma también es válida, la acción puede continuar.
Transmisión de una Cadena
Como se mencionó arriba, la serialización más común de una cadena de autenticación es un arreglo JSON. Este es el enfoque recomendado.
Sin embargo, el protocolo no impone esto. Los desarrolladores pueden usar una estrategia de serialización alternativa si es más conveniente para un caso de uso particular, como YAML, archivos CSV, formatos binarios optimizados o cadenas simples con campos delimitados.
Un ejemplo de serialización alternativa dentro del propio protocolo se puede encontrar en el SignedFetch módulo, que usa una secuencia de cabeceras HTTP en lugar de un arreglo JSON.
Elegir una Fecha de Expiración
Al seleccionar la duración válida para una clave delegada, hay una compensación: expiraciones más cortas aumentan la seguridad, pero expiraciones más largas mejoran la experiencia del usuario (ya que los delegados deben renovarse con interacción humana con menor frecuencia).
No existe una estrategia universal para decidir cuál debe ser la ventana de tiempo válida. Para referencia, el World Explorer de la Foundation solicita autorización para su clave delegada por un mes.
Las claves efímeras nunca deben contener fondos ni poseer la capacidad de transferir activos digitales. Es mucho más seguro para los usuarios finales si la filtración de una clave efímera no puede resultar en pérdidas financieras.
Formalización
A continuación hay una definición más formal y precisa de los procesos involucrados. Sigue estas instrucciones para manejar con éxito las cadenas de autenticación.
Creación
Los clientes que crean una cadena de autenticación para el usuario siguen estos pasos:
Agregar el paso de identificación:
Establecer el
typeaSIGNER.Establecer el
payloada la dirección de Ethereum del usuario.Establecer el
firmaa una cadena vacía.
Agregar pasos de delegación:
Generar o usar una clave privada de delegado existente (puede requerir interacción).
Calcular la dirección Etherum del delegado derivada de la clave pública correspondiente.
Establecer el
typeaECDSA_EPHEMERAL.Establecer el
expiracióna una fecha en el futuro.Elegir un
propósitopara esta clave.Establecer el
payloada esta forma exacta:Establecer el
firmacampo alpayloadfirma de la clave anterior (usuario o delegado).Repetir para todos los delegados sucesivos.
Agregar el paso de autorización de la acción:
Establecer el
typea un valor válido (ver más abajo)Establecer el
payloadal valor específico del tipo (como el ID de entity).Establecer el
firmacampo alpayloadfirma de la clave anterior (usuario o delegado).
Enviar la cadena de autenticación al verificador.
Verificación
Los servidores de contenido y servicios de terceros que implementen la verificación siguen estos pasos:
Verificar identificación:
Verifica que el
typeesSIGNER.Verifica que el
payloades la dirección de Ethereum del usuario.Verifica que el
firmaes una cadena vacía.
Verificar delegados:
Verifica que el
typeesECDSA_EPHEMERAL.Verifica que el
payloadestá en esta forma y extraer los campos:Verifica que el
fechaaún está en el futuro.Verifica que el
propósitoes compatible con tu servicio.Verifica que el
firmaes válido para el dadopayloady la clave pública previa.Repetir para todos los delegados sucesivos.
Verificar autorización de la acción:
Verifica que el
typees un valor válido (ver más abajo).Verifica que el
payloades válido para estetype.Verifica que el
firmaes válido para el dadopayloady la clave pública previa.
Aceptar la cadena de autenticación.
Tipos y Propósitos de Acción Estándar
El type y payload los valores para identificación y delegación son estándar y deben verificarse como se establece arriba, pero los clientes y servicios pueden acordar cualquier type, y su payload estructura, así como establecer un propósito para sus claves delegadas que consideren válido.
El protocolo define tres tipos estándar, y un propósito estándar:
Tipo SIGNER
Debe ser el type inicial en la cadena, donde payload es la dirección de Ethereum del usuario y firma es una cadena vacía.
Tipo ECDSA_EPHEMERAL
Debe ser el type para pasos intermedios en la cadena, donde payload está en la forma descrita arriba.
Tipo ECDSA_SIGNED_ENTITY
El type final en la cadena para autorizar despliegues de entity, donde payload es el ID de una entity poseída por el usuario.
Propósito Decentraland Login
El propósito habitual para World Explorers, firmado tanto al iniciar sesión en el mundo como al renovar su clave delegada.
Última actualización