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

导航至

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

注意:在今天的教程中,我们将使用默认在端口 8086 上运行的 InfluxDB 2.0-rc。如果您在 Cloud 或之前的 OSS v2 版本中运行,请将 URL 替换为您的 Cloud URLhttp://localhost:9999/ 分别。虽然您可以使用任何 API 开发工具(如 Postman)或 curl 来执行本 TL;DR 中描述的 API 调用,但我们使用 Python 和 Requests 库 来提供可以更轻松地合并到 Python IoT 应用程序中的示例。

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

使用 API 自动化令牌的创建和列出对于各种任务非常有用。例如,假设您正在 InfluxDB 之上构建一个物联网应用程序。当新用户通过您的应用程序注册帐户时,您将希望创建一个具有该新用户唯一权限的令牌。注册后,将为每个用户自动生成一个范围限定为存储桶的写入令牌。此外,您可能决定为每个用户的设备提供不同的身份验证令牌,以便您可以在需要时稍后撤销它。这种方法假设应用程序开发者是

  1. 对 InfluxDB 写入 API 的功能感到满意,并且
  2. 计划编写自己的读/写 API,以根据其自身的应用程序要求将安全的、经过授权的读取请求转发到 InfluxDB。

重要的是要注意,直接向用户授予令牌访问权限可能会给物联网应用程序开发者带来问题,并且可能最终用户来说也很麻烦。

使用 InfluxDB v2 API 创建令牌

为了创建令牌,您需要

  • 来自 InfluxDB v2 API 文档 的正确端点。
  • 一个 All Access 令牌 – 最有可能您将使用在注册 InfluxDB 帐户时生成的令牌。您可以在导航栏的 数据 选项卡中找到您的令牌。

influxdb token

  • 您的 orgID。单击导航栏中的 帐户下拉菜单。它直接位于 数据 选项卡上方,您可以在其中找到您的令牌。此下拉菜单将列出您的用户名以及组织名称。单击 关于 以获取您的用户 ID 和 orgID。

influxdb orgid user id

要创建新的 All Access 令牌,请使用以下脚本,该脚本利用了我们刚刚收集的上述信息

import requests
import json
url = 'http://localhost: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)

此令牌使您能够读取和写入“授权”或令牌。它还使您能够从任何存储桶读取和写入。运行脚本后,您应该看到以下响应

{
  "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 将在下一节中使用,以列出特定令牌。如果要创建用于读取和写入数据的令牌,该令牌的作用域限定为特定存储桶,请将有效负载更改为以下内容

payload = {
 "orgID": "ec4a5f5fee6ed685",
 "description": "User1",
 "permissions": [
   {
     "action": "write",
     "resource": {
       "type": "buckets",
       "id": "e279b9d2a176f64f",
     }
   },
   {
     "action": "read",
     "resource": {
       "type": "buckets",
       "id": "e279b9d2a176f64f",
     }
   }
 ]
}

在此有效负载中,我们仅提供存储桶资源以及我们要将令牌访问权限限定到的特定存储桶 ID。要了解如何通过 API 创建存储桶,请查看此文档或此博客。最后,请注意我们如何在上面的有效负载中同时包含读取和写入操作,以创建读/写令牌。如果要创建仅写入令牌,该令牌的作用域限定为用于单个用户或设备注册的存储桶,请将有效负载最小化为以下内容

payload = {
 "orgID": "ec4a5f5fee6ed685",
 "description": "Device1",
 "permissions": [
   {
     "action": "write",
     "resource": {
       "type": "buckets",
       "id": "e279b9d2a176f64f",
     }
   }
 ]
}

使用 InfluxDB v2 API 列出令牌

为了使用 InfluxDB v2 API 列出令牌,您需要与上述相同的信息。此脚本允许您列出所有令牌

import requests
import json
 
url = 'http://localhost: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('http://localhost: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 = 'http://localhost: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('http://localhost: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 创建令牌,并为您提供为您的物联网应用程序生成存储桶所需的示例。如果您正在创建物联网应用程序或出于其他原因使用 API,请向我们寻求帮助并分享您的故事!在评论区、我们的社区站点或我们的 Slack 频道中分享您的想法、疑虑或问题。我们很乐意获得您的反馈并帮助您解决遇到的任何问题!