(八&九)如何与InfluxDB交互&InfluxDB HTTP API

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦!

第 8 章 前言:如何与InfluxDB交互

1、InfluxDB启动后,会向外提供一套HTTP API。外部程序可以也仅能通过HTTP API与InfluxDB进行通信。我们后面要讲到的influx命令行、Web UI 和各编程语言的客户端库,其内部都是封装的对HTTP API的调用。

2、所以各种客户端同InfluxDB交互时,都离不开API TOKEN。因为HTTP是一种支持官方且简单的协议,这也方便了用户进行二次开发。

第 9 章 InfluxDB HTTP API

1、InfluxDB提供了丰富的API和客户端库,可以随时和你的应用程序集成。你也可以随时使用curl和ApiPost、Postman这类程序来测试API接口。

2、本文章会先带大家看一些最常用的API,然后再告诉大家如何使用API文档。但本文中不会对InfluxDB的全部API进行讲解。

9.1 准备token

1、在你想尝试使用HTTP API与InfluxDB进行交互时,首先应该用账号和密码登到WebUI上选择或创建一个对应的API TOKEN。课程中,我们使用tony's Token,这是一个具有全部权限的API Token,实际开发时应谨慎使用,防止Token被劫持出现安全问题。

2、在后面的操作中,你每次发出HTTP请求时都需要在请求头上携带token。

9.2 准备接口测试工具

1、在shell中你可以使用curl测试接口,不过带图形界面的程序终归是更易用一些。本文选用ApiPost这一专门的接口测试软件进行演示。ApiPost是一款国产软件,对标的是google的postman,截至视频课录制时,ApiPost的最新版本是 6 ,易用性比上一个

版本有大幅提升,用起来很顺手。

9.2.1 安装ApiPost

1、大家可以直接访问ApiPost的官网下载对应系统的安装包 https://www.apipost.cn/

9.2.2 准备调试环境

1、在左侧的目录栏上有一个文件夹 按钮,点一下,创建一个新的目录。

2、给目录命名,同时为这个目录添加一个公用header。这样这个目录下的所有接口都会自动带上这个header,不需要我们再一个个地手动设置了。我们之前提到过,要想使用InfluxDB的API,请求头上必须要加上token。所以,我们就把token设为公用header。

9.3 接口的授权

9.3.1 Token授权方式

9.3.1.1 成功什么样

1、现在我们先来看一下授权是否是成功的。

  • 首先,点击左侧的目录名称,右键会弹出一个菜单栏。点击新建接口
  • 你可以自定义一个接口的名称,然后在接下来的 URL 栏里,填写 http://localhost:8086/api/v2/authorizations 点击发送。
  • 接下来我们可以看到页面的下方弹出了返回的数据。这个接口返回的数据我们InfluxDB上目前所有的Token信息,包括他们拥有什么权限。成功看到数据,说明我们的Token是有效的。
  • 最后记得点击保存,或者使用Ctrl+S快捷键。这样,我们目录下面才会真正留下一个接口。方便你日后访问。

9.3.1.2 失败什么样

1、我们也可以看一下授权失败是什么效果。

  • 在目录上点击右键,再点击编辑目录。
  • 将Authotization请求头关掉. 点击右下角的保存
  • 现在回到我们的接口调试页面上,再次点击发送。可以看到状态码为 401 ,而且数据的json告诉我们没有授权。
  • 记得回去将目录的公共请求头放开,继续进行后面的操作。

9.3.2 登录授权方式

1、登录授权其实是留给Web UI用的,但是你也可以尝试用这种方式获取授权。InfluxDB服务端会判断你的cookie是否合法、以及是否过期。符合要求的话就能调用接口实现一系列操作。

2、进行接下来的操作前,记得关闭目录下的公用请求头。

9.3.2.1 创建登录会话

1、在InlfluxDB api v2 目录下创建一个新的接口

2、给接口自定义一个名称

3、请求的类型选择POST,填写目标的URL

4、配置登录信息

  • 在请求连接的下方点击一下"认证"按钮
  • 在认证方式上选择 Basic auth 认证
  • 在下方的输入框上输入InfluxDB的用户名和密码,课程中是tony, 11111111 。

5、点击发送。

9.3.2.2 登录原理

1、 什么是Basic auth认证

你常见的认证方式可能是将用户名和密码放到post请求的请求体中,再发送给服务端进行认证。不过我们刚才并没有在请求体里放用户名和密码,而是配置了一个叫Basic auth认证的东西。这个功能叫做http基本认证,是http协议的一部分。

基本认证的默认实现是:

( 1 )把用户名和密码用英文冒号拼起来,也就成了tony:11111111

( 2 )再将拼起来的字符串用 Base64算法编码。(tony:11111111的Base64编码为

dG9ueToxMTExMTExMQ==)

( 3 )给编码结果 dG9ueToxMTExMTExMQ==,添加一个前缀Basic所以最后的结果

就是。

Basic dG9ueToxMTExMTExMQ==

( 4 )把这个字符串放到一个key为authorization 的请求头中,发送给服务端。

2、查看请求头

3、所以,你可以在页面下方查看这次请求的请求头,如图所示,它就是我们基本认证的结晶。在众多的编程语言中,base 64 算法都会作为标准库的一部分存在。你可以在python中验证tony:11111111的base64编码结果。

4、查看响应头,我们还可以看一下这次请求的响应头,你可以看到响应头上有一个key为set-cookie的键值对。set-cookie键其实会向浏览器,或者编程语言中的 Session对象添加一个全局 cookie。

5、以后每次的请求就会自动携带这个cookie,以后InfluxDB的接口服务就会依据这个cookie来判断请求方是否有权限进行相关操作。ApiPost也有记录cookie的功能,你可以在ApiPost的Cookie管理器中,查看已经设置的全局cookie。

6、查看Cookie管理器

  • ApiPost的Cookie管理器在页面的最上方。
  • 弹出的窗口就是Cookie管理器。下面首先会列出你的域名或者host,老师这里是localhost,点一下,可以看到它下面的全部cookie。
  • 再点一下influxdb-oss-seesion,就可以看到这个cookie的内容可,可以看到它跟刚才响应头的set-cookie内容一模一样。

9.3.2.3 验证授权效果

1、接下来,我们会到之前的列出所有 token的接口里去,在目录共享请求头关闭的前提下,调用api。

2、直接点击发送按钮

3、响应码为 200 ,且成功出现了数据,说明我们现在是有权限的,可以点击下面的请求头按钮,看一下这次请的请求头。

9.3.2.4 关闭全局cookie再查看效果

1、接下来我们关闭全局cookie再查看效果。

  • 在ApiPost中打开Cookie管理器,按图中操作,关闭Cookie。
  • 再次向 /api/v2/authorizations 发送请求。可以看到我们这次没权限了
  • 再次查看请求头。这次我们失去了cookie。

9.3.2.5 小结

1、这一节,我们了解用登录的方式获取授权。但是,大家还要注意两点

  • http基本认证默认实现的安全问题

我们前面讲过,http基本认证其实就是把tony:11111111的Base64编码放在的请求头上,但是Base64只是一种数据的编码方式,它不是加密算法也不是信息摘要算法。这也就是说,一旦我的请求被拦截,那对方就能看到我的用户名和密码,对我实施中间人攻击。

2、如图所示,Base64编码的字符串也可以被解码为明文。

3、所以,从安全角度考虑,不应当在开发时将Web UI暴露在公网上。而且集成应用时,授权也千万不可以用登录方式,应该全部使用token。

4、Cookie有过期时间

当你和别的应用进行集成时,也不应该使用登录的方式,登录授予的cookie是有过期时间的,大概半小时,cookie就会过期。用户必须重新登录拿到新的 cookie 才能和InfluxDB继续交互。授权的内容就说到这了。

5、大家进行后面操作的时候,记得恢复目录的公用请求头,并关闭Cookie。这样,我们就还是使用token授权的方式完成后面的一系列操作。

9.4 接口安全:配置HTTPS

1、HTTP是一种纯文本通信协议。早期很多互联网协议都是使用明文的方式来传输数据的。这样,最大的问题就是如果我们的网络请求被劫持,那么劫持的一方可以看到我们请求中的所有数据(包括Token),这样就算是使用Token进行授权比user:password安全一些,但泄漏Token也会带来很多麻烦事。所以,InfluxDB官方强烈建议我们开启HTTPS

9.4.1 使用openssl生成证书

1、下面是官方给出的命令模板。

shell 复制代码
sudo openssl req -x509 -nodes -newkey rsa:2048 \
- keyout /etc/ssl/influxdb-selfsigned.key \
- out /etc/ssl/influxdb-selfsigned.crt \
- days <NUMBER_OF_DAYS>

2、自己跑的时候可以参考做一下调整命令解释:

  • req -x509,指定生成自签名证书的格式。
  • newkey rsa:2048,生成证书请求或者自签名整数时自动生成密钥,然后生成的密钥
    名称由keyout指定。rsa:2048意思是产生rsa密钥,位数是 2048 。
  • keyout,指定生成的密钥名称。
  • out,证书的保存路径
  • days,证书的有效期限,单位是day(天),默认是 365 天。

3、现在,我们执行下面的命令:

shell 复制代码
openssl req -x509 -nodes -newkey rsa:2048 \

- keyout /opt/module/influxdb2_linux_amd64/selfsigned.key \
- out /opt/module/influxdb2_linux_amd64/selfsigned.crt \
- days 60

4、执行这个命令后,会让你输入更多信息。你可以直接全部敲回车,将这些字段留空。不影响生成我们有效的证书文件。执行完这个命令后,/opt/module/influxdb2_linux_amd/ 目录下会产生两个文件,一个是 selfsigned.crt(证书文件)另一个是selfsigned.key(密钥文件)。而且他们的有效期是 60 天

5、至此,你的密钥文件就成功生成了!

9.4.2 确保启动influxd的用户对密钥整数文件有读取权限

9.4.3 启动influxd服务时指定证书和密钥路径

1、使用influxd命令启动InfluxDB服务时,记得指定一下整数的密钥的路径。

shell 复制代码
./influxd
--tls-cert="/opt/module/influxdb2_linux_amd64/selfsigned.crt" \
- -tls-key="/opt/module/influxdb2_linux_amd64/selfsigned.key"

9.4.4 验证HTTPS协议是否生效

1、回到我们的ApiPost6,再次向http:/localhost:8086/api/v2/authorizations发送GET请求。

2、可以看到,我们使用http的协议头再进行访问,响应的状态码为 400 ,并提示我们向HTTPS服务器发送了一个HTTP请求。现在我们将URL前面的http改成https再试一下。

3、如果你也能达到这个效果,说明influxd的ssl/tls认证已经开启,服务端和客户端传递的将会是加密数据而非明文数据。

9.4.5 记得更改已存在的telegraf配置和Scrapers

1、我们之前在WebUI中配置过Telegraf配置和指标的抓取任务,当时我们配的是http协议的URL ,现在也需要全部换成https。

9.5 其他生产安全考虑

1、HTPS是InfluxDB开发时,最基础也是最该考虑的安全措施,除此之外InfluxDB在设计时还为用户考虑了其他的安全措施,这里给大家简单地介绍一下,不再进行操作演示。

9.5.1 IP白名单

1、可以参考: https://docs.influxdata.com/influxdb/v2.4/security/enable-hardening/这个IP白名单并不是限制谁可以访问我的。

而是限制,我InfluxDB的查询可以访问谁的。因为FLUX语言具有发送网络请求的能力,你可以使用InfluxDB的相关配置限定,FLUX脚本可以向哪些地址发送请求。

9.5.2 机密管理

1、这一块的内容可以参考:https://docs.influxdata.com/influxdb/v2.4/security/secrets/

2、假如,我们的自己的应用程序和InfluxDB集成,而用到的一段FLUX脚本刚好需要使用某个第三方服务的用户名和密码(比如查询mysql)。

3、比如:

go 复制代码
import "influxdata/influxdb/secrets"
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://tony:11111111@localhost",
query:"SELECT * FROM example-table",
)

4、应用和InfluxDB服务之间走的也是HTTP通信,那么写在脚本中的用户名和密码是有可能泄漏的。这个时候,你可以把用户名和密码用键值的方式放到InfluxDB管理起来,然后,你就可以在脚本里用key的方式在InfluxDB里获取tony的用户名和密码了。

go 复制代码
import "influxdata/influxdb/secrets"
import "sql"

username = secrets.get(key: "POSTGRES_USERNAME")
password = secrets.get(key: "POSTGRES_PASSWORD")
sql.from(
driverName: "postgres",
dataSourceName: "mysql://${username}:${password}@localhost",
query:"SELECT * FROM example-table",
)

这样,我们Mysql的用户名和密码,就没有在网络上泄漏的风险了。

9.5.3 token管理

1、可以参考:https://docs.influxdata.com/influxdb/v2.4/security/tokens/

2、我们之前讲过在Web上去创建token。这里再给大家补充一下Token的类型。

  • 操作者Token。操作者令牌有跨越组织的管理权限,它对InfluxDB OSS 2.x上的所有组织和资源有完全的读写访问权限。某些操作必须需要操作员权限(比如 查看服务器配置)。操作者 Token是在InfluxDB初始化设置的过程中创建的。要想再创建一个操作者Token,就必须使用先有的操作者Token。

3、由于操作者Token对InfluxDB中所有的组织具有完全的读写访问权限。因此InfluxDB建议为每个组织创建一个全权限Token,并用这些Token来管理InfluxDB。这有助于防止组织间不小心误操作对方资源。

  • 全权限Token。对单个组织中所有资源的完全读取和写入访问权限
  • 读/写 Token。对组织中特定的存储桶进行读取和写入。

9.5.4 禁用部分开发功能

1、可以参考:https://docs.influxdata.com/influxdb/v2.4/security/disable-devel/

2、nfluxDB的API中,有一部分是为了方便外部系统去监控和观测InfluxDB的状态和性能的。如果你觉得这部分可能影响安全,那么你可以随时把它们禁了。

3、比如:

  • /metrics,上文给大家演示过,这里面有各种监控InfluxDB运行的指标
  • Web UI,用户的图形界面交互。
  • /debug/pprof,这个接口里面是Go语言程序的运行时指标,比如堆内存用了多少,有多少线程数等等。

9.6 如何使用API文档

9.6.1 查看API文档

1、可以直接在浏览器上访问 http(s)😕/localhost:8086/docs ,这样可以直接看到对应当前InfluxDB版本对应的API文档。

2、另外也可以在InfluxDB官网上查看在线文档 https://docs.influxdata.com/influxdb/v2.4/api/

9.6.2 测试工具与OpenAPI

1、如果你访问的是本地部署的 InfluxDB,那么访问http://localhost:8086还能下载相应的 OpenAPI文档。

2、访问http://localhost:8086/doc 页面的顶部有一个Download按钮,点一下。浏览器里会

说下载了一个json文件。

可以打开看一下,这其实是一个符合 OpenApi 3 .0格式的API文档定义文件。现在的ApiPost和Postman对这一格式都能自动生成接口测试。此处我们拿postman作为演示。

9.6.3 示例:Postman快速生成测试项目

9.6.3.1 使用postman导入openapi

1、在postman的左侧目录上方,有一个import按钮,点一下,会弹出一个对话框。

2、可以看到,这里他说支持上传OpenApi格式的文件。点击Upload Files按钮,选择刚才下载的swagger(2).json。

3、最后点击右下角的Import按钮。

9.6.3.2 查看导入效果

1、可以看到,InfluxDB 中的全部API已经导入到postman中了。

2、但是这里没有文档中的说明性文字了。找回他们的方法是在postman的左边找到draft,点击一下,再点击右方的

Documentation。如下图所示:


3、现在,你就可以看到既能阅读,又能立刻进行测试的API 文档了。

相关推荐
梦想画家9 小时前
InfluxQL 数据分析实战:聚合、过滤与关联查询全解析
数据分析·influxdb
李兆龙的博客1 天前
从一到无穷大 #46:探讨时序数据库Deduplicate与Compaction的设计权衡
数据库·oracle·时序数据库
TDengine (老段)1 天前
TDengine 运维——巡检工具(安装工具)
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
TDengine (老段)1 天前
TDengine 运维——巡检工具(定期检查)
java·大数据·运维·物联网·时序数据库·tdengine·涛思数据
TDengine (老段)2 天前
TDengine 运维——巡检工具(安装前检查)
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
时序数据说2 天前
时序数据库IoTDB基于云原生的创新与实践
大数据·数据库·分布式·云原生·时序数据库·iotdb
太阳上的雨天4 天前
influxdb时序数据库
golang·时序数据库
时序数据说4 天前
时序数据库IoTDB启动方式及集群迁移指南
大数据·数据库·分布式·开源·php·时序数据库·iotdb
TDengine (老段)5 天前
TDengine 中集群维护
大数据·运维·数据库·时序数据库·tdengine·涛思数据·物联
TDengine (老段)5 天前
TDengine 高可用——双活方案
java·数据库·物联网·时序数据库·tdengine·涛思数据