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-tokensresponde500 failed to mint viewer token- O
ws_tokenfica 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
- Confirme que nenhuma batalha excepcionalmente longa está em voo.
- Rotacione com uma janela de aposentadoria confortavelmente maior que a vida de um token.
- Confirme que a chave nova está
activee a anteriorretiring. - 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.