TL;DR InfluxDB 技术技巧;使用 InfluxDB API 创建令牌

导航至

无论您使用 InfluxDB Cloud 还是 InfluxDB OSS,InfluxDB API 都提供了一种简单的方式与您的 InfluxDB 实例交互。InfluxDB v2 API,包括读取和写入部分,在 InfluxDB v1.8+ 中可用,提供了一种统一的查询、写入数据到 InfluxDB 实例以及评估其健康状况的方法。在本期的技术技巧文章中,我们将学习如何创建和列出 认证令牌。令牌提供了 InfluxDB 实例与其用户之间的安全数据流。令牌属于 组织

注意:在本教程中,我们将使用 InfluxDB 2.0-rc,它默认在 8086 端口运行。如果您在云平台或之前的 OSS v2 版本上运行,请分别替换 URL 为您的 云 URLhttps://127.0.0.1:9999/。虽然您可以使用任何 API 开发工具——如 Postmancurl 来执行本 TL;DR 中描述的 API 调用,但我们使用 Python 和 Requests 库 来提供可以更容易地集成到 Python 物联网应用程序中的示例。

使用 API 进行安全的物联网应用程序开发

使用 API 自动创建和列出令牌对于各种任务都很有用。例如,假设您正在 InfluxDB 之上构建物联网应用程序。当新用户通过您的应用程序注册账户时,您将希望创建一个仅对这位新用户具有独特权限的令牌。注册时,将为每个用户自动生成一个针对存储桶的写令牌。此外,您可能决定为每个用户的设备提供不同的认证令牌,这样在需要时您可以撤销它。这种方法假定应用开发者是

  1. 对InfluxDB写入API的功能表示满意,
  2. 并计划根据自身应用需求编写自己的读写API,以便将加密授权的读取请求转发到InfluxDB。

需要注意的是,直接向用户提供令牌可能会引起问题,对于物联网应用程序开发者和潜在的用户来说可能相当繁琐。

使用InfluxDB v2 API创建令牌

要创建令牌,您需要以下信息:

  • InfluxDB v2 API文档中的正确端点。
  • 一个所有权限的令牌 - 很可能您将使用在注册InfluxDB账户时生成的那个。您可以在导航栏中的“数据”标签下找到您的令牌。

influxdb token

  • 您的orgID。点击导航栏中的“账户下拉菜单”。这位于“数据”标签的正上方,您可以在这里找到您的令牌。此下拉菜单将列出您的用户名以及org名称。点击“关于”以获取您的用户ID和orgID。

influxdb orgid user id

要创建新的所有权限令牌,请使用以下脚本,它利用了我们上面收集到的信息:

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频道中分享您的想法、担忧或问题。我们非常希望得到您的反馈并帮助您解决遇到的问题!