根据github验证用户身份的datasette插件和asgi中间件
datasette-auth-github的Python项目详细描述
datasette auth github
datasette插件和asgi中间件,根据github对用户进行身份验证。
这需要Datasette 0.29或更高版本。
设置说明
- 安装插件-
pip install datasette-auth-github
- 创建github oauth应用程序:https://github.com/settings/applications/new
- 将授权回调url设置为
http://127.0.0.1:8001/-/auth-callback
- 创建具有以下结构的
metadata.json
文件:
{"title":"datasette-auth-github demo","plugins":{"datasette-auth-github":{"client_id":{"$env":"GITHUB_CLIENT_ID"},"client_secret":{"$env":"GITHUB_CLIENT_SECRET"}}}}
现在您可以像这样启动数据集,将机密作为环境变量传入:
$ GITHUB_CLIENT_ID=XXX GITHUB_CLIENT_SECRET=YYY datasette \
fixtures.db -m metadata.json
注意,metadata.json
中的硬编码秘密是一个坏主意,因为它们对任何可以导航到/-/metadata
的人都是可见的。相反,我们对adding secret plugin configuration options使用一种新机制。
默认情况下,插件将要求用户在与dataset交互之前先登录,但它将允许任何拥有github帐户的用户登录。
如果希望匿名用户能够在不登录的情况下查看数据集,可以将"require_auth": false
设置添加到配置中:
{"plugins":{"datasette-auth-github":{"client_id":...,"require_auth":false}}}
自动登录
假设您需要身份验证(默认),dataset将用户重定向到github进行登录。如果用户以前使用github进行过身份验证,则会自动将其重新定向回来,从而提供即时登录体验。
如果您希望他们先看到带有按钮的“您已注销”屏幕,您可以通过将“禁用自动登录”设置添加到您的配置中来更改此行为:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","disable_auto_login":true}}}
限制特定用户的访问
默认情况下,插件将允许任何github用户登录。您可以使用allow_users
配置选项将允许的用户限制到特定列表:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","allow_users":["simonw"]}}}
您可以在这里列出一个或多个github用户名。
限制对特定GitHub组织或团队的访问
您还可以限制特定GitHub组织成员的访问:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","allow_orgs":["datasette-project"]}}}
如果您的组织是arranged into teams,那么您可以将访问权限限制为这样的特定团队:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","allow_teams":["your-organization/engineering"]}}}
将此命令与“dataset publish”命令一起使用
allow_orgs
、allow_users
和allow_teams
都可以是单个字符串,而不是列表。这意味着您可以完全从命令行发布数据并配置插件,如下所示:
$ datasette publish nowv1 fixtures.db \
--alias datasette-auth-demo \
--install=datasette-auth-github \
--plugin-secret datasette-auth-github client_id 86e397f7fd7a54d26a3a \
--plugin-secret datasette-auth-github client_secret ... \
--plugin-secret datasette-auth-github allow_user simonw
Cookie过期
此插件设置的cookies默认在一小时后过期。拥有过期cookies的用户将通过github自动重定向回登录,因此他们不太可能注意到自己的cookies已经过期。
您可以使用cookie_ttl
设置以秒为单位更改cookie过期策略。下面是如何将超时时间增加到24小时:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","cookie_ttl":86400}}}
强制cookie过期
如果将GitHub组织或团队与此插件一起使用,则需要注意,即使用户已从团队或组织中删除,他们也可能会继续持有有效的cookie,除非您更改了cookie_ttl
,否则通常最多保存一个小时。
如果需要立即撤消对实例的访问,可以使用cookie_version
设置来执行此操作。只需修改元数据为cookie_version
添加一个新值,然后重新启动或重新部署数据集实例:
{"plugins":{"datasette-auth-github":{"client_id":"...","client_secret":"...","cookie_version":2}}}
所有现有的Cookie将失效。仍然是组织或团队成员的用户将能够再次登录-实际上可能会自动登录。从组织或团队中删除的用户将失去对dataset实例的访问权限。
将其用作没有数据集的asgi中间件
虽然datasette-auth-github
被设计为用作Datasette plugin,但它也可以用作常规asgi中间件,向任何asgi应用程序添加github身份验证。
以下是操作方法:
fromdatasette_auth_githubimportGitHubAuthfromyour_asgi_appimportasgi_appapp=GitHubAuth(asgi_app,client_id="github_client_id",client_secret="github_client_secret",require_auth=True,# Defaults to False# Other options:# cookie_ttl=24 * 60 * 60,# disable_auto_login=True,# allow_users=["simonw"],# allow_orgs=["my-org"],# allow_teams=["my-org/engineering"],)
关键字参数的工作方式与上面记录的datasette插件设置相同。
有一个关键区别:当用作插件时,require_auth
默认为true。如果你是使用中间件包装您自己的应用程序默认行为是允许匿名访问-您需要显式设置require_auth=True
关键字参数来更改此行为。
以这种方式包装后,如果用户尚未登录,应用程序将重定向到github进行身份验证。使用签名的cookie记录身份验证。
中间件将一个新的"auth"
键添加到包含登录用户详细信息的作用域中,然后将其传递给您的应用程序。scope["auth"]
键的内容如下:
{"id":"1234 (their GitHub user ID)","name":"Their Display Name","username":"their-github-username","email":"their-github@email-address.com","ts":1562602415}
"ts"
值是一个整数time.time()
时间戳,表示用户上次登录的时间。
如果用户未登录(并且您没有使用所需的身份验证),则"auth"
作用域密钥将设置为None
。