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​