Datasette插件,用于使用API令牌进行访问认证
项目描述
datasette-auth-tokens
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的权限文档。