根据github验证用户身份的datasette插件和asgi中间件

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


datasette auth github

PyPICircleCILicense

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_orgsallow_usersallow_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

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

推荐PyPI第三方库


热门话题
存储库的java Hibernate OneToMany关联表字段不能为空。保存(entityModel)   java当应用程序被用作可导入的库/JAR时,spring作用域是如何工作的   java JavaFX Hibernate映射异常   为什么MySQL Bit在Java中返回Blob?如何处理相同的问题?   java在应用程序启动时使用计时器启动EJB   雅加达邮件MessaginExceptionIOException在用java发送邮件时发生异常?   java如何在Android Tv中保持屏幕打开   java使用JavaScript将视图计数器和观看的总分钟数存储到数据库   sql server如何使用java在mssql中插入列   Java和Scala中的最小和最大堆   实现Java8驱动接口的jdbc   java读取文件并放入一些数组   swing Java私有JTextField更新问题   java Firebase获取条目的当前值   从Apache2中运行的Angular向spring引导api发送请求时未找到java 404   java根据JComboBox中的第一项显示该项   JavaGroovy读取jsonfile,添加新键:value并写回(Jenkins)   在客户端web服务上使用JBossWS时,java无法找到/更改log4j的默认配置   java如何获取匿名对象的引用2级以上