TL;DR InfluxDB 技术技巧;使用 InfluxDB API 创建令牌
作者 Anais Dotis-Georgiou / 产品,用例,开发者
2020年10月22日
导航至
无论您使用 InfluxDB Cloud 还是 InfluxDB OSS,InfluxDB API 都提供了一种简单的方式与您的 InfluxDB 实例交互。InfluxDB v2 API,包括读取和写入部分,在 InfluxDB v1.8+ 中可用,提供了一种统一的查询、写入数据到 InfluxDB 实例以及评估其健康状况的方法。在本期的技术技巧文章中,我们将学习如何创建和列出 认证令牌。令牌提供了 InfluxDB 实例与其用户之间的安全数据流。令牌属于 组织。
注意:在本教程中,我们将使用 InfluxDB 2.0-rc,它默认在 8086 端口运行。如果您在云平台或之前的 OSS v2 版本上运行,请分别替换 URL 为您的 云 URL 或 https://127.0.0.1:9999/。虽然您可以使用任何 API 开发工具——如 Postman 或 curl 来执行本 TL;DR 中描述的 API 调用,但我们使用 Python 和 Requests 库 来提供可以更容易地集成到 Python 物联网应用程序中的示例。
使用 API 进行安全的物联网应用程序开发
使用 API 自动创建和列出令牌对于各种任务都很有用。例如,假设您正在 InfluxDB 之上构建物联网应用程序。当新用户通过您的应用程序注册账户时,您将希望创建一个仅对这位新用户具有独特权限的令牌。注册时,将为每个用户自动生成一个针对存储桶的写令牌。此外,您可能决定为每个用户的设备提供不同的认证令牌,这样在需要时您可以撤销它。这种方法假定应用开发者是
- 对InfluxDB写入API的功能表示满意,
- 并计划根据自身应用需求编写自己的读写API,以便将加密授权的读取请求转发到InfluxDB。
需要注意的是,直接向用户提供令牌可能会引起问题,对于物联网应用程序开发者和潜在的用户来说可能相当繁琐。
使用InfluxDB v2 API创建令牌
要创建令牌,您需要以下信息:
- InfluxDB v2 API文档中的正确端点。
- 一个所有权限的令牌 - 很可能您将使用在注册InfluxDB账户时生成的那个。您可以在导航栏中的“数据”标签下找到您的令牌。
- 您的orgID。点击导航栏中的“账户下拉菜单”。这位于“数据”标签的正上方,您可以在这里找到您的令牌。此下拉菜单将列出您的用户名以及org名称。点击“关于”以获取您的用户ID和orgID。
- 从InfluxDB v2 API文档中获取的POST请求负载结构。
要创建新的所有权限令牌,请使用以下脚本,它利用了我们上面收集到的信息:
import requests
import json
url = 'https://127.0.0.1:8086/api/v2/authorizations'
# or if you're using InfluxDB Cloud, including the Free Cloud Tier
# url = 'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/authorizations'
headers = {'Authorization': 'Token $INFLUX_TOKEN'}
payload = {
"orgID": "ec4a5f5fee6ed685",
"description": "AllAccessAuth",
"permissions": [
{
"action": "read",
"resource": {
"type": "authorizations",
}
},
{
"action": "write",
"resource": {
"type": "authorizations",
}
},
{
"action": "write",
"resource": {
"type": "buckets",
}
},
{
"action": "read",
"resource": {
"type": "buckets",
}
}
]
}
r = requests.post(url, headers=headers, json=payload)
pretty_json = json.loads(r.text)
authID = pretty_json["id"]
token = pretty_json["token"]
print(json.dumps(pretty_json, indent=2))
print(authID)
print(token)
此令牌使您能够读取和写入“授权”或令牌。它还使您能够从任何bucket读取和写入。运行脚本后,您应看到以下响应:
{
"id": "06739699648b5000",
"token": "$INFLUX_TOKEN",
"status": "active",
"description": "AllAccessAuth",
"orgID": "ec4a5f5fee6ed685",
"org": "my-org",
"userID": "066bc91b58057000",
"user": "my-username",
"permissions": [
{
"action": "read",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "buckets"
}
},
{
"action": "read",
"resource": {
"type": "buckets"
}
}
],
"links": {
"self": "/api/v2/authorizations/06739699648b5000",
"user": "/api/v2/users/066bc91b58057000"
},
"createdAt": "2020-10-12T14:50:13.138935-05:00",
"updatedAt": "2020-10-12T14:50:13.138935-05:00"
}
06739ae02b4b5000
pKKPBa__Ck_-3z0FO1qjpd6P6RYiPJIGcFljQ0ygTobEXvCATjpi2DgkqmSKTjFYSRhuEV4tnpjwmn2gP-y9Jw==
我们还打印了来自json响应的auth ID(即令牌ID)和令牌。auth ID将在下一节中用于列出特定令牌。如果您想为特定bucket创建读取和写入数据的令牌,请将负载更改为以下内容:
payload = {
"orgID": "ec4a5f5fee6ed685",
"description": "User1",
"permissions": [
{
"action": "write",
"resource": {
"type": "buckets",
"id": "e279b9d2a176f64f",
}
},
{
"action": "read",
"resource": {
"type": "buckets",
"id": "e279b9d2a176f64f",
}
}
]
}
在此负载中,我们只提供bucket资源以及我们想要将令牌访问范围限制到的特定bucket ID。有关如何通过API创建bucket的更多信息,请参阅此文档或此博客。最后,请注意,我们在上面的负载中同时包括了读取和写入操作以创建读写令牌。如果您想为个人用户或设备注册创建仅写入的bucket范围令牌,请将负载简化为以下内容:
payload = {
"orgID": "ec4a5f5fee6ed685",
"description": "Device1",
"permissions": [
{
"action": "write",
"resource": {
"type": "buckets",
"id": "e279b9d2a176f64f",
}
}
]
}
使用InfluxDB v2 API列出令牌
要使用InfluxDB v2 API列出令牌,您需要与上面相同的信息。此脚本允许您列出所有令牌:
import requests
import json
url = 'https://127.0.0.1:8086/api/v2/authorizations'
# or if you're using InfluxDB Cloud, including the Free Cloud Tier
# url = 'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/authorizations'
headers = {'Authorization': 'Token $INFLUX_TOKEN'}
r = requests.get('https://127.0.0.1:8086/api/v2/authorizations/', headers=headers)
pretty_json = json.loads(r.text)
print(json.dumps(pretty_json, indent=2))
运行脚本后,您应看到列出了所有令牌。以下响应的一部分包括我们刚刚创建的令牌。
{[{
"id": "06739688dc4b5000",
"token": "$INFLUX_TOKEN",
"status": "active",
"description": "AllAccessAuth",
"orgID": "ec4a5f5fee6ed685",
"org": "my-org",
"userID": "066bc91b58057000",
"user": "my-username",
"permissions": [
{
"action": "read",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "buckets"
}
},
{
"action": "read",
"resource": {
"type": "buckets"
}
}
],
"links": {
"self": "/api/v2/authorizations/06739688dc4b5000",
"user": "/api/v2/users/066bc91b58057000"
},
"createdAt": "2020-10-12T14:49:56.209911-05:00",
"updatedAt": "2020-10-12T14:49:56.209911-05:00"
},
{
"id": "06739699648b5000",
"token": "$INFLUX_TOKEN",
"status": "active",
"description": "AllAccessAuth",
"orgID": "ec4a5f5fee6ed685",
"org": "my-org",
"userID": "066bc91b58057000",
"user": "my-username",
"permissions": [
{
"action": "read",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "authorizations"
}
},
{
"action": "write",
"resource": {
"type": "buckets"
}
},
{
"action": "read",
"resource": {
"type": "buckets"
}
}
],
"links": {
"self": "/api/v2/authorizations/06739699648b5000",
"user": "/api/v2/users/066bc91b58057000"
},
"createdAt": "2020-10-12T14:50:13.138935-05:00",
"updatedAt": "2020-10-12T14:50:13.138935-05:00"
}
]
}
要列出特定令牌,您需要提供作为路径参数的auth ID。将您的auth ID附加到URL上,如下面的脚本所示:
import requests
import json
url = 'https://127.0.0.1:8086/api/v2/authorizations/06739688dc4b5000'
# or if you're using InfluxDB Cloud, including the Free Cloud Tier
# url = 'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/authorizations/06739688dc4b5000'
headers = {'Authorization': 'Token $INFLUX_TOKEN'}
r = requests.get('https://127.0.0.1:8086/api/v2/authorizations/', headers=headers)
pretty_json = json.loads(r.text)
print(json.dumps(pretty_json, indent=2))
关于使用InfluxDB v2 API管理令牌的最终思考
我希望这篇InfluxDB技术技巧文章能够激发您利用InfluxDB v2 API创建令牌,并提供您生成物联网应用程序bucket所需的示例。如果您正在创建物联网应用程序或出于其他原因使用API,请向我们寻求帮助并分享您的经历!在评论区、我们的社区网站或我们的Slack频道中分享您的想法、担忧或问题。我们非常希望得到您的反馈并帮助您解决遇到的问题!