跳转到主要内容

Datasette插件,用于使用API令牌进行访问认证

项目描述

datasette-auth-tokens

PyPI Changelog Tests License

Datasette插件,用于使用API令牌进行访问认证

安装

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

$ pip install datasette-auth-tokens

硬编码令牌

了解Datasette的认证和权限系统

此插件允许您配置秘密API令牌,这些令牌可以用于向Datasette发出认证请求。

首先,创建一个随机的API令牌。一个有用的方法是以下内容

$ python -c 'import secrets; print(secrets.token_hex(32))'
5f9a486dd807de632200b17508c75002bb66ca6fde1993db1de6cbd446362589

确定此令牌应代表的操作者,例如

{
    "bot_id": "my-bot"
}

然后,您可以使用 "allow" 块为此令牌提供访问特定操作的权限。为了允许访问配置的可写SQL查询,您可以在您的 metadata.json 中使用以下内容

{
    "plugins": {
        "datasette-auth-tokens": {
            "tokens": [
                {
                    "token": {
                        "$env": "BOT_TOKEN"
                    },
                    "actor": {
                        "bot_id": "my-bot"
                    }
                }
            ]
        }
    },
    "databases": {
        ":memory:": {
            "queries": {
                "show_version": {
                    "sql": "select sqlite_version()",
                    "allow": {
                        "bot_id": "my-bot"
                    }
                }
            }
        }
    }
}

此方法使用Datasette的秘密配置值机制,允许将秘密令牌作为环境变量传递。

按照以下方式运行Datasette

BOT_TOKEN="this-is-the-secret-token" \
    datasette -m metadata.json

现在您可以运行认证API查询,如下所示

$ curl -H 'Authorization: Bearer this-is-the-secret-token' \
  'http://127.0.0.1:8001/:memory:/show_version.json?_shape=array'
[{"sqlite_version()": "3.31.1"}]

此外,您还可以允许将令牌作为查询字符串参数传递,尽管出于包含秘密令牌的URL的安全性考虑,这默认是禁用的。这可能有助于轻松地在不同的服务之间嵌入数据。

只需使用 param 配置值启用即可

{
    "plugins": {
        "datasette-auth-tokens": {
            "tokens": [
                {
                    "token": {
                        "$env": "BOT_TOKEN"
                    },
                    "actor": {
                        "bot_id": "my-bot"
                    },
                }
            ],
            "param": "_auth_token"
        }
    },
    "databases": {
        ":memory:": {
            "queries": {
                "show_version": {
                    "sql": "select sqlite_version()",
                    "allow": {
                        "bot_id": "my-bot"
                    }
                }
            }
        }
    }
}

现在您可以运行认证API查询,如下所示

$ curl http://127.0.0.1:8001/:memory:/show_version.json?_shape=array&_auth_token=this-is-the-secret-token
[{"sqlite_version()": "3.31.1"}]

来自您数据库的令牌

作为(或作为)硬编码令牌列表的替代方案(或补充),您可以将令牌存储在数据库表中,并配置插件通过SQL查询访问它们。

您的查询需要接受一个 :token_id 参数,并返回至少两列:一列称为 token_secret,另一列称为 actor_* - 通常为 actor_id。还可以返回更多以 actor_ 前缀命名的列,以提供认证操作者的更多详细信息。

这是一个配置查询的简单示例

select actor_id, actor_name, token_secret from tokens where token_id = :token_id

这可以运行在类似这样的表上

token_id token_secret actor_id actor_name
1 bd3c94f51fcd 78 Cleopaws
2 86681b4d6f66 32 Pancakes

令牌的格式为令牌ID,然后是一个连字符,然后是令牌秘密。例如

  • 1-bd3c94f51fcd
  • 2-86681b4d6f66

SQL查询将使用连字符前的部分作为:token_id参数执行。

查询返回的token_secret值将与连字符后的令牌部分进行比较,以检查令牌是否有效。

actor_为前缀的列将用于填充演员字典。在上面的示例中,令牌2-86681b4d6f66将变成一个演员字典{"id": 32, "name": "Pancakes"}

要配置此功能,请在您的插件配置中使用一个"query"块,如下所示

{
    "plugins": {
        "datasette-auth-tokens": {
            "query": {
                "sql": "select actor_id, actor_name, token_secret from tokens where token_id = :token_id",
                "database": "tokens"
            }
        }
    },
    "databases": {
        "tokens": {
            "allow": {}
        }
    }
}

这里的"sql"键包含SQL查询。"database"键包含应该执行查询的附加数据库文件的名称 - 在这种情况下,它将执行对tokens.db的查询。

保护您的令牌

任何可以访问您的Datasette实例的人都可以使用它来读取令牌表中的token_secret列。这可能不是您想要的!

为了避免这种情况,您应该限制对表的访问。上面的配置示例显示了如何使用"allow": {}块来做到这一点。有关如何限制此类访问的更多信息,请参阅Datasette的权限文档

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

datasette-auth-tokens-0.3.tar.gz (8.3 kB 查看散列)

上传时间

构建分布

datasette_auth_tokens-0.3-py3-none-any.whl (8.8 kB 查看散列)

上传时间 Python 3

由以下组织支持