Pular para o conteúdo principal

Chaves de assinatura

O keyring Ed25519 que assina tokens de viewer. Só super-usuário: uma chave assina para todo casino da instância, então não é recurso de nenhum deles.

Por que esta tem janela

Um token de viewer vive 15 minutos e já está no browser de todo mundo que está assistindo. Trocar a chave de uma vez invalida todos eles ao mesmo tempo, derrubando a plateia inteira de toda batalha em andamento.

A rotação, portanto, nomeia uma chave nova e deixa a anterior verificando até se aposentar:

O kid no header de cada token é o que permite a um verificador segurar as duas chaves.

Uma janela de aposentadoria menor que o tempo de vida de um token é recusada, porque deixaria a pé tokens ainda válidos. Escolha uma janela com folga real, não a mínima.

Exatamente uma chave fica ativa

Garantido por um índice único parcial no banco, não por lógica de serviço que duas rotações concorrentes poderiam correr.

O status é derivado do timestamp de aposentadoria e nunca armazenado, então status e aposentadoria não podem divergir.

A rotação é um POST, não um PUT

Ela não é idempotente: chamar duas vezes emite duas chaves e aposenta duas.

A rotação vale imediatamente

Os dois consumidores resolvem o keyring por chamada, em vez de capturá-lo no boot. Sem isso, uma rotação só valeria no próximo deploy.

Falha fechada

Um keyring sem chave dá erro. Ele não cai para tokens não assinados nem pula a verificação.

Os dois pontos de chamada degradam igual em erro e em nil: o handshake do WebSocket responde 401, e a emissão responde "não ok". Um terceiro consumidor exigiria rechecar essa equivalência antes de ser confiável.

A variável de ambiente é só bootstrap

SLOTBATTLE_WS_SIGNING_PRIVATE_KEY_PEM vale só enquanto a tabela de chaves está vazia.

Uma vez que exista uma chave, a rotação é a única forma de trocá-la. Editar a variável e fazer redeploy não tem efeito.

Sintomas de nenhuma chave

  • POST /battles/{id}/viewer-tokens responde 500 failed to mint viewer token
  • O ws_token fica ausente das respostas de criação e de assento. É um campo opcional, então não há erro para capturar
  • Batalhas abrem e enchem normalmente; só a visualização ao vivo fica indisponível

Se um casino reporta que a visualização ao vivo não funciona enquanto tudo o mais está bem, cheque isso primeiro.

Rotacionando com segurança

  1. Confirme que nenhuma batalha excepcionalmente longa está em voo.
  2. Rotacione com uma janela de aposentadoria confortavelmente maior que a vida de um token.
  3. Confirme que a chave nova está active e a anterior retiring.
  4. Deixe a janela passar. Os espectadores existentes não são afetados em nenhum momento.

Avise os integradores, se você tiver algum. Conduzida direito, a rotação é invisível; conduzida sem janela, ela derruba a plateia deles, e eles vão precisar saber qual dos dois foi.