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:
| Status | Quer dizer | O cliente deve |
|---|---|---|
| 401 | não sei quem você é (sem credencial, ou inválida) | autenticar de novo |
| 403 | sei quem você é, e você não pode | nã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 403Para 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.