跳转到主要内容

管理用于其他Datasette插件的API密钥等机密信息

项目描述

datasette-secrets

PyPI Changelog Tests License

管理用于其他Datasette插件的API密钥等机密信息

此插件需要Datasette 1.0 alpha版本。

Datasette插件有时需要访问机密,例如用于与Datasette外部托管工具集成的API密钥 - 如地理编码器或托管AI语言模型。

此插件提供配置这些机密的方法

  • 可以使用环境变量(如DATASETTE_SECRETS_OPENAI_API_KEY)配置机密
  • 机密可以存储在SQLite数据库表的加密形式中,管理员用户可以通过Datasette网络界面更新这些加密的密钥

安装

在Datasette相同环境中安装此插件。

datasette install datasette-secrets

配置

首先,您需要为该插件生成一个加密密钥。运行此命令

datasette secrets generate-encryption-key

请将此密钥保存在安全的地方。它将用于加密和解密此插件存储的机密 - 如果丢失,您将无法恢复您的机密。

使用这两个插件设置配置插件

plugins:
  datasette-secrets:
    encryption_key:
      $env: DATASETTE_SECRETS_ENCRYPTION_KEY
    database: name_of_database

encryption_key设置应设置为之前生成的加密密钥。如果您愿意,可以将其存储在环境变量中。

database是应存储加密密钥的数据库名称。省略此设置以使用内部数据库。

使用内部数据库

虽然存储在datasette_secrets表中的机密是加密的,但我们仍然建议将其从视图中隐藏。

一种方法是将其保留在Datasette的内部数据库中,该数据库对所有用户都不可见,即使是登录用户。

默认情况下,内部数据库是一个内存数据库,在Datasette重新启动时重置。这不适合持久性机密存储!

相反,您应该将Datasette切换到使用磁盘内数据库。您可以通过使用--internal选项启动Datasette来实现这一点。

datasette data.db --internal internal.db

您的机密信息将存储在该数据库文件中的datasette_secrets表中。

权限

只有具有manage-secrets权限的用户才能通过Datasette Web界面管理机密。

您可以通过在datasette.yml文件中包含以下内容来将该权限授予root用户(或您选择的用户)

permissions:
  manage-secrets:
    id: root

然后以这种方式启动Datasette(使用--root获取以root用户身份登录的URL)

datasette data.db --internal internal.db -c datasette.yml --root

或者,使用-s选项设置该设置而不创建配置文件

datasette data.db --internal internal.db \
  -s permissions.manage-secrets.id root \
  --root

用法

具有manage-secrets权限的用户将在Datasette导航菜单中看到一个新链接“管理机密”。该界面也可以通过/-/secrets访问。

显示机密列表的页面将显示最后更新每个机密的用户。这将使用actors_from_ids()机制,如果可用,则显示actor的username,否则显示name,否则显示id

对于插件作者

如果想要实现机密,插件可以依赖于此插件。

pyproject.toml中的dependencies列表中添加datasette-secrets

然后使用register_secrets()插件钩子声明您需要的任何机密的名称和描述

from datasette import hookimpl
from datasette_secrets import Secret

@hookimpl
def register_secrets():
    return [
        Secret(
            name="OPENAI_API_KEY",
            description="An OpenAI API key"
        ),
    ]

您还可以提供可选的obtain_urlobtain_label字段,以链接到用户可以获取API密钥的页面

@hookimpl
def register_secrets():
    return [
        Secret(
            name="OPENAI_API_KEY",
            obtain_url="https://platform.openai.com/api-keys",
            obtain_label="Get an OpenAI API key"
        ),
    ]

钩子可以接受可选的datasette参数。它可以返回一个列表或一个返回列表的async def函数。

列表应包含Secret()实例,每个实例都有一个名称和一个可选的描述。描述可以包含HTML。

要获取机密的当前值,请使用await get_secret()方法

from datasette_secrets import get_secret

# Third argument is the actor_id, optional
secret = await get_secret(datasette, "OPENAI_API_KEY", "root")

如果Datasette管理员设置了DATASETTE_SECRETS_OPENAI_API_KEY环境变量,则将返回该变量。

否则,数据库表中的加密值将被解密并返回,或者如果没有配置机密,则返回None

每次访问机密时,都会更新last_used_at列。将last_used_by列设置为传递给get_secret()的actor ID,如果没有传递actor ID,则设置为null

开发

要本地设置此插件,首先检出代码。然后创建一个新的虚拟环境

cd datasette-secrets
python3 -m venv venv
source venv/bin/activate

现在安装依赖项和测试依赖项

pip install -e '.[test]'

要运行测试

pytest

项目详细信息


下载文件

下载适合您平台的自定义文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分发

datasette_secrets-0.2.tar.gz (16.6 kB 查看散列)

上传于 源代码

构建分发

datasette_secrets-0.2-py3-none-any.whl (13.0 kB 查看哈希值)

上传于 Python 3

由以下组织支持