From 020e25d653c785eb8d399001ab7ba5c6fc816c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Garapich?= Date: Mon, 21 Apr 2025 21:22:07 +0200 Subject: [PATCH] API authentication initial --- docs/server-api.md | 13 ++++++++++++- static/img/content/server-api/cookie.png | Bin 0 -> 16493 bytes 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 static/img/content/server-api/cookie.png diff --git a/docs/server-api.md b/docs/server-api.md index f95f6b4..8be737a 100644 --- a/docs/server-api.md +++ b/docs/server-api.md @@ -2,4 +2,15 @@ title: Server API --- -TODO: describe API usage +### Authentication + +The authentication is implemented via cookies. In order to obtain a valid cookie, one must simply copy the `auth_token` one from the browser's console and use to for desired API calls. + +![cookie](/img/content/server-api/cookie.png) + +For example, in order to update a given player's skill, one can execute the following command: + +```bash +$ curl -b "auth_token=" -X PUT -H "Content-Type: application/json" -d '{"scout":4,"soldier":6,"demoman":3,"medic":2}' https://api.tf2pickup.eu/players/76561199195756652/skill +{"scout":4,"soldier":6,"demoman":3,"medic":2} +``` diff --git a/static/img/content/server-api/cookie.png b/static/img/content/server-api/cookie.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ab49ce506dd254306796c5d6d990328be999e0 GIT binary patch literal 16493 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