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.
É 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" } }
| Escopo | Rotas |
|---|---|
games:read | GET /games |
battles:read | GET /battles, GET /battles/{id} |
battles:write | POST /battles, /seats, /leave, /cancel |
bots:write | POST /battles/{id}/bot-seats |
viewer:mint | POST /battles/{id}/viewer-tokens |
demo:mint | POST /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ção | Status | Código |
|---|---|---|
Sem header Authorization | 401 | unauthorized |
| Chave desconhecida, revogada ou expirada | 401 | unauthorized |
| Chave válida, escopo faltando | 403 | forbidden |
| Chave válida, tenant suspenso | 403 | forbidden |
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
- Chaves e credenciais: toda credencial e como ela rotaciona
- Erros: o catálogo completo de códigos
- Chaves de API no console