Product SiteDocumentation Site

44.2. Аутентификация

Есть два способа доступа к API PVE:
  • использование временно сгенерированного токена (билета);
  • использование API-токена.
Все API-запросы должны включать в себя билет в заголовке Cookie или отправлять API-токен через заголовок Authorization.

44.2.1. Билет Cookie

Билет — это подписанное случайное текстовое значение с указанием пользователя и времени создания. Билеты подписываются общекластерным ключом аутентификации, который обновляется один раз в день.
Кроме того, любой запрос на запись (POST/PUT/DELETE) должен содержать CSRF-токен для предотвращения CSRF-атак (cross-site request forgery).
Пример получения нового билета и CSRF-токена:
$ curl -k -d 'username=root@pam' --data-urlencode 'password=xxxxxxxxx' \
https://192.168.0.186:8006/api2/json/access/ticket

Примечание

Параметры командной строки видны всей системе, поэтому следует избегать запуска команды с указанием пароля на ненадежных узлах.
Пример получения нового билета и CSRF-токена с паролем, записанным в файл, доступный для чтения только пользователю:
$ curl -k -d 'username=root@pam' --data-urlencode "password@$HOME/.pve-pass-file" \
https://192.168.0.186:8006/api2/json/access/ticket

Примечание

Для форматированного вывода можно использовать команду jq (должен быть установлен пакет jq):
$ curl -k -d 'username=root@pam' --data-urlencode "password@$HOME/.pve-pass-file" \
https://192.168.0.186:8006/api2/json/access/ticket | jq
Пример ответа:
{
  "data": {
    "ticket":"PVE:root@pam:66AA52D6::d85E+IIFAuG731…",
    "CSRFPreventionToken":"66AA52D6:Y2zvIXjRVpxx4ZG74F14Ab0EHn8NRoso/WmVqZEnAuM",
    "username":"root@pam"
  }
}

Примечание

Билет действителен в течение двух часов и должен быть повторно запрошен по истечении срока его действия. Но можно получить новый билет, передав старый билет в качестве пароля методу /access/ticket до истечения срока его действия.
Полученный билет необходимо передавать с Cookie при любом запросе, например:
$ curl -k -b "PVEAuthCookie=PVE:root@pam:66AA52D6::d85E+IIFAuG731…" \
https://192.168.0.186:8006/api2/json/
Ответ:
{
  "data": [
    { "subdir": "version" },
    { "subdir": "cluster" },
    { "subdir": "nodes" },
    { "subdir": "storage" },
    { "subdir": "access" },
    { "subdir": "pools" }
  ]
}

Примечание

Для передачи данных в заголовке Cookie используется параметр --cookie (-b).
Любой запрос на запись (POST, PUT, DELETE) кроме билета должен включать заголовок CSRFPreventionToken, например:
$ curl -k -XDELETE \
'https://pve01:8006/api2/json/access/users/testuser@pve' \
-b "PVEAuthCookie=PVE:root@pam:66AA52D6::d85E+IIFAuG731…" \
-H "CSRFPreventionToken: 66AA52D6:Y2zvIXjRVpxx4ZG74F14Ab0EHn8NRoso/WmVqZEnAuM"