用于使用API令牌对访问进行身份验证的Datasette插件

datasette-auth-tokens的Python项目详细描述


数据集身份验证令牌

PyPICircleCILicense

用于使用API令牌对访问进行身份验证的Datasette插件

安装

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

$ pip install datasette-auth-tokens

硬编码令牌

阅读关于Datasette的authentication and permissions system。在

此插件允许您配置秘密API令牌,可用于对Datasette发出经过身份验证的请求。在

首先,创建一个随机的API令牌。一个有用的方法是:

^{pr2}$

决定此令牌应表示的参与者,例如:

{"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的secret configuration values mechanism允许将秘密令牌作为环境变量传递。在

按如下方式运行数据集:

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"}]

数据库中的令牌

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

您的查询需要使用一个:token_id参数并返回至少两个列:一个名为token_secret,另一个名为actor_*-通常是actor_id。还可以返回前缀为actor_的列,以便为经过身份验证的参与者提供更多详细信息。在

下面是一个配置查询的简单示例:

selectactor_id,actor_name,token_secretfromtokenswheretoken_id=:token_id

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

token_idtoken_secretactor_idactor_name
1bd3c94f51fcd78Cleopaws
286681b4d6f6632Pancakes

令牌的格式是令牌ID,然后是连字符,然后是令牌机密。例如:

  • 1-bd3c94f51fcd
  • 2-86681b4d6f66

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

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

前缀为actor_的列将用于填充actor字典。在上面的例子中,2-86681b4d6f66的标记将成为{"id": 32, "name": "Pancakes"}的actor字典。在

要对此进行配置,请在插件配置中使用"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执行。在

保护您的代币

任何有权访问dataset实例的人都可以使用它来读取tokens表中的token_secret列。这可能不是你想要的!在

为了避免这种情况,您应该锁定对该表的访问。上面的配置示例演示了如何使用"allow": {}块来实现这一点。有关如何锁定这种访问的更多信息,请参阅Datasette的Permissions documentation。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用jain api上的编解码器信息自动创建sdp消息   显示素数误报的java程序   java如何从存储x、y值和整数索引之间的时间变化的两个数组列表创建动画?   java CompletableFuture:转换与组合   具有多个in运算符的java CrudePository findBy方法签名?   java:扩展小程序进程超时   java如何做mvn scm插件匿名pserver cvs访问   java如何在选中项目时将项目从一个活动发送到另一个活动   java存储子网的最佳数据结构,用于将Ip地址与子网匹配   java Jackson序列化以报告无法序列化的字段列表   如何将java mysql连接器导入IntelliJ?   如果java只在构造函数中编写,它是线程安全的集合吗?   java正则表达式捕获组在OR运算符后返回null   java使用Jackson在运行时将实体动态序列化为其ID或完整表示形式