Authentication Chain
Muitas ações no protocolo Decentraland exigem ou se beneficiam da autorização com uma assinatura da conta Ethereum do usuário. Por exemplo:
Enviar uma nova versão de qualquer Entidade que eles possuam (como seu perfil).
Autenticar-se em serviços de terceiros.
Autorizar delegados a agir em seu nome.
Para executar essas ações, usuários e delegados devem assinar cargas úteis que descrevam sua intenção e produzir um auth_chain.
Introdução
Cadeias de autenticação encapsulam uma série de etapas de verificação, com cada etapa dependendo da verificação bem-sucedida da anterior. Todas as etapas devem ser consideradas válidas pelo verificador para que qualquer ação restrita ocorra.
Toda cadeia começa identificando o usuário e termina com uma carga útil assinada que representa a ação solicitada. A menor cadeia contém assim dois elementos, que indicam:
1. A autoridade é a conta Ethereum <user-address>
2. A carga útil é <payload>, autorizada por <user-signature>Essa cadeia básica pode ser avaliada verificando que a chave pública da assinatura corresponde ao endereço. Nesse caso, é equivalente a uma assinatura simples.
Quando usuários autorizam delegados a agir em seu nome, aparecem etapas intermediárias na cadeia. Por exemplo, uma cadeia com uma única delegação indicaria:
1. A autoridade é a conta Ethereum <user-address>
2. O delegado é <delegate-address>, autorizado por <user-signature> até <date>
3. A carga útil é <payload>, autorizada por <delegate-signature>As cadeias são mais longas quando delegados autorizam seus próprios delegados. Em outras palavras, a autorização é transitiva.
Você pode pensar nas cadeias de autenticação como análogas às cadeias de certificados TLS usadas em HTTPS, com o usuário como o equivalente à autoridade raiz.
Essa cadeia com um único delegado é a forma mais comum de autorização usada no Decentraland, já que os usuários autorizam uma chave para seu World Explorer para evitar ter que assinar cada ação individual com sua conta Ethereum.
Construindo uma Cadeia
Cada etapa na cadeia de autenticação contém três informações: um type, um payload e uma assinatura.
type
O nome de um tipo (veja abaixo).
payload
Uma string dependente do tipo.
assinatura
A assinatura Ethereum codificada em hex de payload, começando com 0x.
Como a serialização mais comum de uma cadeia de autenticação é um array JSON, os exemplos abaixo são apresentados nessa forma. Veja Transmitindo uma Cadeia para mais detalhes.
Primeira Etapa: Identificação
A primeira etapa, que identifica a autoridade original (i.e. o usuário), deve satisfazer estas condições:
O
typeestiverSIGNERO
payloadé a conta Ethereum codificada.O
assinaturaestá vazia.
Por exemplo:
A segunda etapa deve conter uma assinatura dessa conta para seu payload.
Etapas Intermediárias: Delegação
Quando delegados estão agindo em nome do usuário, um item é adicionado no meio da cadeia para cada um deles. As condições para essas etapas são:
O tipo é
ECDSA_EPHEMERALO
payloadé um texto especialmente elaborado (veja abaixo).
O payload é projetado para ser fácil de ler e fácil de analisar, já que tanto humanos (ao usar a interface da carteira) quanto programas (ao criar e validar) devem trabalhar com ele. Contém exatamente 3 linhas de texto simples sensível a maiúsculas/minúsculas:
Por exemplo, esta é uma carga útil típica usada pelos World Explorers durante o login, quando eles geram sua chave delegada temporária para o usuário aprovar:
Note que:
O
Endereço efêmeronão precisa ser uma conta Ethereum real com fundos na blockchain. O campo pode apenas representar uma chave pública temporária.O
Expiraçãoé uma data/hora serializada em ISO-8601 formato. Não precisa ser UTC.A chave delegada deve ser renovada periodicamente com uma nova assinatura do usuário, devido a essa data de expiração.
É prática padrão (e altamente recomendada) gerar uma nova chave para cada renovação (daí o nome ECDSA_EPHEMERAL).
Um exemplo de etapa de delegação (valores abreviados para clareza):
A próxima etapa, seja outra delegação ou a autorização final, carrega uma assinatura da chave deste delegado.
Última Etapa: Autorização
Após o SIGNER ter sido especificado e todas as ECDSA_EPHEMERAL chaves delegadas terem sido validadas verificando a cadeia de assinaturas intermediárias, a etapa final é a ação real que precisa ser autorizada.
O payload depende do type da etapa. Por exemplo, se um usuário está enviando um novo perfil (ou qualquer entidade que possua) para um servidor de conteúdo, o último elemento terá esta forma:
Se essa última assinatura também for válida, a ação pode prosseguir.
Transmitindo uma Cadeia
Como mencionado acima, a serialização mais comum de uma cadeia de autenticação é um array JSON. Esta é a abordagem recomendada.
No entanto, o protocolo não impõe isso. Desenvolvedores podem usar uma estratégia de serialização alternativa se for mais conveniente para um caso de uso particular, como YAML, arquivos CSV, formatos binários otimizados ou strings simples com campos delimitados.
Um exemplo de serialização alternativa dentro do próprio protocolo pode ser encontrado no SignedFetch módulo, que usa uma sequência de cabeçalhos HTTP em vez de um array JSON.
Escolhendo uma Data de Expiração
Ao selecionar a duração válida para uma chave delegada, há um trade-off: expirações mais curtas aumentam a segurança, mas expirações mais longas melhoram a experiência do usuário (já que delegados precisam ser renovados com interação humana com menor frequência).
Não existe uma estratégia universal para decidir qual deve ser a janela de tempo válida. O World Explorer da Foundation, para referência, solicita autorização para sua chave delegada por um mês.
Chaves efêmeras nunca devem conter fundos nem possuir a capacidade de transferir ativos digitais. É muito mais seguro para usuários finais se o vazamento de uma chave efêmera não puder resultar em perdas financeiras.
Formalização
O que segue é uma definição mais formal e precisa dos processos envolvidos. Siga estas instruções para lidar com cadeias de autenticação com sucesso.
Criação
Clientes que criam uma cadeia de autenticação para o usuário seguem estes passos:
Adicione a etapa de identificação:
Defina o
typeparaSIGNER.Defina o
payloadpara o endereço Ethereum do usuário.Defina o
assinaturapara uma string vazia.
Adicione etapas de delegação:
Gere ou use uma chave privada delegada existente (pode exigir interação).
Calcule o endereço Ethereum do delegado derivado da correspondente chave pública.
Defina o
typeparaECDSA_EPHEMERAL.Defina o
expiraçãopara uma data no futuro.Escolha um
propósitopara esta chave.Defina o
payloadpara esta forma exata:Defina o
assinaturacampo para apayloadassinatura da chave anterior (usuário ou delegado).Repita para todos os delegados sucessivos.
Adicione a etapa de autorização da ação:
Defina o
typepara um valor válido (veja abaixo)Defina o
payloadpara o valor específico do tipo (como o ID da entidade).Defina o
assinaturacampo para apayloadassinatura da chave anterior (usuário ou delegado).
Envie a cadeia de autenticação ao verificador.
Verificação
Servidores de conteúdo e serviços de terceiros que implementam verificação seguem estes passos:
Verificar identificação:
Verifique se o
typeestiverSIGNER.Verifique se o
payloadé o endereço Ethereum do usuário.Verifique se o
assinaturaé uma string vazia.
Verificar delegados:
Verifique se o
typeestiverECDSA_EPHEMERAL.Verifique se o
payloadestá nesta forma e extraia os campos:Verifique se o
dataainda está no futuro.Verifique se o
propósitoé suportado pelo seu serviço.Verifique se o
assinaturaé válido para o dadopayloade a chave pública anterior.Repita para todos os delegados sucessivos.
Verificar autorização da ação:
Verifique se o
typeé um valor válido (veja abaixo).Verifique se o
payloadé válido para estetype.Verifique se o
assinaturaé válido para o dadopayloade a chave pública anterior.
Aceite a cadeia de autenticação.
Tipos de Ação e Propósitos Padrão
O type e payload valores para identificação e delegação são padrão e devem ser verificados conforme descrito acima, mas clientes e serviços podem concordar em qualquer type, e sua payload estrutura, bem como definir um propósito para suas chaves delegadas que considerem válido.
O protocolo define três tipos padrão e um propósito padrão:
Tipo SIGNER
Deve ser o type inicial na cadeia, onde payload é o endereço Ethereum do usuário e assinatura é uma string vazia.
Tipo ECDSA_EPHEMERAL
Deve ser o type para etapas intermediárias na cadeia, onde payload está na forma descrita acima.
Tipo ECDSA_SIGNED_ENTITY
O type final na cadeia para autorizar implantações de entidades, onde payload é o ID de uma entidade pertencente ao usuário.
Propósito Decentraland Login
O usual propósito para World Explorers, assinado tanto ao entrar no mundo quanto ao renovar sua chave delegada.
Atualizado