Pular para o conteúdo principal

Autenticação

Toda rota S2S recebe uma chave de API do tenant como bearer token.

Authorization: Bearer sbk_0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9

A chave é sbk_ seguido de 64 caracteres hex. Só o hash SHA-256 dela é armazenado, então ela não pode ser recuperada: o texto puro é mostrado uma vez, na criação.

Nunca envie isso de um browser

É uma credencial servidor a servidor com escopo do seu casino inteiro. Qualquer coisa que a tenha pode abrir batalhas, sentar bots e ler todas as suas batalhas. Passe as chamadas pelo seu próprio backend; o tutorial mostra o padrão.

O tenant vem da chave

Não há header de tenant nesta superfície e não há campo de tenant para enviar. A chave identifica o casino, e tudo que a requisição alcança tem escopo dele.

Enviar um mesmo assim não contorna isso: os corpos são decodificados de forma estrita, então um campo tenant_id extra é recusado com 400 unknown field "tenant_id".

Escopos

Cada chave carrega o próprio conjunto. Uma rota cujo escopo falta responde 403 e o nomeia:

{ "error": { "code": "forbidden", "message": "missing scope: battles:write" } }
EscopoRotas
games:readGET /games
battles:readGET /battles, GET /battles/{id}
battles:writePOST /battles, /seats, /leave, /cancel
bots:writePOST /battles/{id}/bot-seats
viewer:mintPOST /battles/{id}/viewer-tokens
demo:mintPOST /games/{id}/demo-sessions

bots:write não é coberto por battles:write. Sentar bots gasta as sessões de provedor do próprio casino, o que é um ato diferente de abrir um lobby.

demo:mint emite uma sessão de jogo demo para um jogo do seu catálogo. Não faz parte do fluxo de produção, em que a sessão de um jogador real vem do seu próprio login, então existe para demos, smoke tests e suporte, e é limitado à parte. Uma integração de produção não precisa dele.

Emita o conjunto mais estreito que funciona

Um backend que só renderiza batalhas precisa de games:read e battles:read. Um que também as abre precisa de battles:write. Dê a cada serviço a própria chave: revogar uma chave compartilhada derruba todos os consumidores de uma vez.

Modos de falha

CondiçãoStatusCódigo
Sem header Authorization401unauthorized
Chave desconhecida, revogada ou expirada401unauthorized
Chave válida, escopo faltando403forbidden
Chave válida, tenant suspenso403forbidden

O 401 é uniforme: ausente, malformada, desconhecida, revogada e expirada respondem o mesmo corpo. Distingui-las diria a um atacante quais tentativas chegaram perto.

Um tenant suspenso é o único caso com resposta específica, tenant suspended, porque o chamador é legítimo e precisa saber que deve parar de retentar.

Emissão e revogação

Pelo console: Casino → Chaves de API. Custa apikeys.write; ler a lista custa apikeys.read. O texto puro é mostrado uma vez, na tela, e nunca mais.

Se a sua conta não carrega apikeys.write, peça ao seu host para emitir e revogar por você. A revogação vale imediatamente, sem cache para esperar.

Toda emissão e revogação registra quem fez. Uma chave que o seu host emitiu fora do console não tem operador logado e aparece na lista atribuída a CLI / unknown em vez de uma célula vazia.

Rotacionando uma chave

Não há rotação no lugar. Emita a substituta, faça o deploy dela, e só então revogue a antiga. Revogar primeiro significa indisponibilidade por todo o tempo do deploy.

Próximo