Pular para o conteúdo

Autenticação numa API

Bearer token, 401 contra 403, o middleware que falha fechado, e o token assinado do próprio Kiln.

Autenticar é saber quem pede; autorizar é saber se ele pode. São dois códigos diferentes, e confundi-los esconde um incidente:

StatusQuer dizerO cliente deve
401não sei quem você é (sem credencial, ou inválida)autenticar de novo
403sei quem você é, e você não podenão tentar de novo — pedir permissão
dataforge
adopt Arcane.Kiln as Kiln

steady SEGREDO := "troque-isto"
app := Kiln.app()

action quem_e(token):
    dados := Kiln.unsign(token, SEGREDO)
    yield void given dados is void otherwise dados["usuario"]

Kiln.use(app, Kiln.auth(quem_e))
Kiln.get(app, "/eu", lambda req: Kiln.json({"usuario": req["state"]["user"]}))
action apagar(req):
    given req["state"]["user"] is not "admin":
        yield Kiln.problema(403, "Sem permissão", "só o administrador apaga pedidos")
    yield Kiln.status(204)

Kiln.delete(app, "/pedidos/:id", apagar)

token := Kiln.sign({"usuario": "ana"}, SEGREDO)
cab := {"Authorization": $"Bearer {token}"}

assert Kiln.test(app, "GET", "/eu")["status"] is 401
assert Kiln.test(app, "GET", "/eu", void, {"Authorization": "Bearer forjado"})["status"] is 401
assert Kiln.test(app, "GET", "/eu", void, cab)["body"]["usuario"] is "ana"
assert Kiln.test(app, "DELETE", "/pedidos/1", void, cab)["status"] is 403

Para autorização além de um given na rota — papéis, dono do recurso, negação explícita —, use `Arcane.Politica`. Para JWT de outro emissor, Crypto.jwt_verificar.