全网首个详细案例:zabbix7.2 对比老版本API认证方法更新适配实战说明

从 Zabbix 7.2 版本开始,Zabbix API 的认证机制发生了变化,不再支持通过 URL 参数中的auth直接传递认证令牌进行 API 调用。这一变更是为了提高安全性,防止令牌在 URL 中被轻易截获。

一、问题描述

Zabbix 6.2.6版本API认证是在url请求使用auth进行令牌认证:

data '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid"]},"auth":"0424bd59b807674191e7d77572075f33","id":1}'

相关API接口二次开发程序在连接时会出现如下32600报错反馈:

{'jsonrpc': '2.0', 'error': {'code': -32600, 'message': 'Invalid request.', 'data': 'Invalid parameter "/": unexpected parameter "auth".'}, 'id': 1}

提示"auth"参数无效,无法连接。

二、问题分析

1、问题查询

通过问题信息全网搜索+多个AI分析,未找到解决方法。

2、官网检索

在7.2官网文档中,可以看到请求信息中确实已经去除了auth参数

经过反复检索,终于看到一处认证变更说明信息,现截取如下

2.1认证

要在 Zabbix 中访问任何数据,您需要:

  • 使用现有的 API token(在 Zabbix 前端创建或使用 Token API 创建);

  • 使用通过 user.login 方法获得的认证令牌。

例如,如果您想以标准 Admin 用户身份登录以获取新的认证令牌,那么一个 JSON 请求可能看起来像这样:

复制代码
curl --request POST \
  --url 'https://example.com/zabbix/api_jsonrpc.php' \
  --header 'Content-Type: application/json-rpc' \
  --data '{"jsonrpc":"2.0","method":"user.login","params":"username":"Admin","password":"zabbix"},"id":1}'

如果您正确提供了凭据,API 返回的响应应该包含用户认证令牌:

复制代码
{    "jsonrpc": "2.0",    "result": "0424bd59b807674191e7d77572075f33",    "id": 1}
2.2授权方法

通过 "Authorization" 头部

所有 API 请求都需要认证或 API 令牌。 您可以使用 "Authorization" 请求头部提供凭据:

复制代码
curl --request POST \
  --url 'https://example.com/zabbix/api_jsonrpc.php' \
  --header 'Authorization: Bearer 0424bd59b807674191e7d77572075f33'

"auth" 属性已被弃用:

复制代码
curl --request POST \
  --url 'https://example.com/zabbix/api_jsonrpc.php' \
  --header 'Content-Type: application/json-rpc' \
  --data '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid"]},"auth":"0424bd59b807674191e7d77572075f33","id":1}'

三、实战请求代码样例

获取主机信息代码样例

现在您有一个有效的用户认证令牌,可以用来访问 Zabbix 中的数据。例如,您可以使用 host.get 方法来检索所有配置的 hosts 的 ID、主机名和接口:

请求:

复制代码
curl --request POST \
  --url 'https://example.com/zabbix/api_jsonrpc.php' \
  --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
  --header 'Content-Type: application/json-rpc' \
  --data @data.json

data.json 是一个包含 JSON 查询的文件。您可以在 --data 参数中直接传递查询,而不是使用文件。

data.json

复制代码
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]    },
    "id": 2
}

响应对象将包含有关主机的请求数据:

复制代码
{
    "jsonrpc": "2.0",
    "result": [
        {
            "hostid": "10084",
            "host": "Zabbix server",
            "interfaces": [
                {
                    "interfaceid": "1",
                    "ip": "127.0.0.1"
                }
            ]
        }
    ],
    "id": 2
}

按要求将用户认证令牌写入"Authorization" 请求头部,实测试验证通过,请求恢复正常应答。

相关推荐
ALGO阿狗9 小时前
一款简单易用的远程日志查看器,可实时查看云服务器上的日志数据
运维·服务器·日志
微露清风9 小时前
系统性学习Linux-第三讲-进程概念
linux·运维·学习
请你喝好果汁6419 小时前
Linux-sh -c \dirname
linux·运维·服务器
Trouvaille ~9 小时前
【Linux】线程同步与互斥(四):线程池与任务管理
linux·运维·服务器·c++·操作系统·线程池·日志系统
qinyia9 小时前
如何在服务器上查看网络连接数并进行综合分析
linux·运维·服务器·开发语言·人工智能·php
Alter12309 小时前
拆开“超节点”的伪装:没有内存统一编址,仍是服务器堆叠
运维·服务器
思麟呀9 小时前
进程间通信
linux·运维·服务器
搬砖者(视觉算法工程师)9 小时前
简单介绍Docker:Docker 容器中预装 Ubuntu 20.04 与 ROS Noetic
docker
hwj运维之路9 小时前
超详细ubuntu22.04部署k8s1.28高可用(一)【多master+keepalived+nginx实现负载均衡】
运维·云原生·kubernetes·负载均衡
七七powerful10 小时前
Docker 容器化 GPU 压测工具(压测单卡)
运维·docker·容器