Plone的插件
项目描述
pas.plugins.oidc
这是一个用于 OpenID Connect 的 Plone 认证插件。OAuth 2.0 也应该可以正常工作,因为 OpenID Connect 是建立在 OAuth 2.0 协议之上的。
特性
PAS 插件,尽管目前没有激活任何接口。
此 PAS 插件有三个浏览器视图,这是与外界的主要交互方式。
安装
通过将其添加到您的 buildout 中安装 pas.plugins.oidc
[buildout] ... eggs = pas.plugins.oidc
然后运行 bin/buildout
警告
请注意用作用户 ID 字段的 用户信息属性 的自定义设置,错误的配置很容易冒充其他用户。
安装和配置插件
转到插件控制面板并安装 pas.plugins.oidc。
在 ZMI 中,转到插件属性,链接为 https://127.0.0.1:8080/Plone/acl_users/oidc/manage_propertiesForm
使用您提供商获取的数据配置属性
OIDC/Oauth2 发行者
客户端 ID
客户端密钥
redirect_uris:这需要与用户登录流程完成后将被重定向的 公开 URL 匹配。它需要包含 /Plone/acl_users/oidc/callback 部分。当使用 Volto 时,您需要以某种方式暴露 Plone,以便登录过程可以正确完成。
使用 Zope 会话数据管理器:请参阅以下关于会话使用的部分。
创建用户 / 更新用户属性:当选中用户数据时,Plone 中的用户数据将使用来自 OIDC 提供商的数据进行更新。
创建认证 __ac 票证:当选中时,用户将被允许在 Plone 中作为已登录用户执行操作。
创建认证 auth_token(Volto/REST API)票证:当选中时,用户将被允许在 Volto 前端作为已登录用户执行操作。
请求服务器的 Open ID 范围:请求 OIDC 提供商的信息。保留默认设置或根据您提供商的信息进行修改。
使用 PKCE:当启用时,在从提供商请求认证时使用 PKCE。
登录和注销 URL
当使用此插件与 Plone 6 经典 UI 时,用于登录(https://127.0.0.1:8080/Plone/login)和注销(https://127.0.0.1:8080/Plone/logout)的标准 URL 不会触发插件的使用。
当使用此插件与 Volto 前端 时,用于登录(https://127.0.0.1:3000/login)和注销(https://127.0.0.1:3000/logout)的标准 URL 不会触发插件的使用。
要使用 OIDC 提供商登录站点,您需要将那些登录 URL 更改为以下内容
登录 URL:/<Plone 站点 ID>/acl_users/<oidc pas 插件 ID>/login
注销 URL:/<Plone 站点 ID>/acl_users/<oidc pas 插件 ID>/logout
其中
Plone 站点 ID:是在创建 Plone 站点时分配的 ID。通常是 Plone,但可能不同。这是在直接浏览 Plone 而不使用任何代理服务器时 URL 的最后一部分,例如 https://127.0.0.1:8080/Plone+ -> Plone。
oidc pas 插件 ID:是在 Plone PAS 管理面板内部创建 OIDC 插件时分配的 ID。如果您只是使用了默认配置,并通过 Plone 的插件控制面板安装了此插件,则此 ID 将是 oidc。
当使用 Volto 作为前端时,您需要以某种方式公开登录和注销 URL,以便使登录和注销过程能够正常工作。
使用 Keycloak 的示例配置
将 Keycloak 设置为服务器
请参考Keycloak 文档获取最新指示。具体来说,这里我们将使用 Docker 镜像,因此请遵循在 Docker 上开始使用 Keycloak 的说明。这不会为您提供一个生产环境配置,但对于本地开发来说已经足够。
注意:Keycloak 默认在端口 8080 上运行。Plone 也使用相同的端口。当您阅读此文档时,您可能知道如何让 Plone 使用不同的端口。所以让我们让 Keycloak 使用其首选端口。在撰写本文时,这是启动 Keycloak 容器的方法:
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:19.0.3 start-dev
插件可以与旧的(已弃用)Keycloak redirect_uri 参数一起使用。要使用此功能,您需要在插件配置中启用选项。要测试,可以运行带有 --spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true 选项的 Keycloak 服务器。
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:19.0.3 start-dev --spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true
注意:当您退出此容器时,它仍然存在,您可以重新启动它,这样您就不会丢失您的配置。使用 docker ps -a 查找容器的名称,然后使用 docker container start -ai <name>。
进一步遵循 Keycloak Docker 文档
打开Keycloak 管理控制台,确保您已以 admin 身份登录。
在左上角单击“master”,然后单击“创建领域”。
在“领域名称”字段中输入 plone。
单击“创建”。
在左上角单击“master”,然后单击“plone”。
在左侧菜单中单击“管理” -> “用户”。
单击“创建新用户”。
请记住在“凭证”选项卡中为此用户设置密码。
在另一个浏览器中检查您是否可以使用此用户登录到Keycloak 账户控制台。
在原始浏览器中,按照确保您第一个应用安全性的步骤进行。但我们将为 Plone 使用不同的设置。在我上次检查时,实际的用户界面与文档中的描述有所不同。因此
打开Keycloak 管理控制台,确保您已以 admin 身份登录。
在左上角单击“master”,然后单击“plone”。
在左侧菜单中单击“管理” -> “客户端”。
单击“创建客户端”
客户端类型: OpenID Connect
客户端 ID: plone
将“始终在控制台显示”设置为“开”,适用于测试。
单击“下一步”并单击“保存”。
现在您可以填写“设置” -> “访问设置”。我们将假设 Plone 在端口 8081 上运行
根 URL: https://127.0.0.1:8081/Plone/
主页 URL: https://127.0.0.1:8081/Plone/
有效的重定向 URI: https://127.0.0.1:8081/Plone*
提示:除非您知道自己在做什么,否则请保留其他设置不变。
现在您可以填写“设置” -> “能力配置”。
将客户端认证设置为开启。这定义了OIDC客户端的类型。当开启时,OIDC类型设置为保密访问类型。当关闭时,设置为公开访问类型。
点击保存。
现在您可以通过凭据 -> 客户端密钥访问,并点击复制的图标来复制它。这将在配置Plone插件时是必要的。
Keycloak配置完成!
设置Plone为客户端
在您的Zope实例配置中,确保Plone在8081端口运行。
确保使用pip或Buildout安装了pas.plugins.oidc。
启动Plone并创建一个ID为Plone的Plone站点。
在附加组件控制面板中,安装pas.plugins.oidc。
在ZMI中,转到https://127.0.0.1:8081/Plone/acl_users/oidc/manage_propertiesForm的插件属性
设置以下属性
OIDC/Oauth2 发行者: https://127.0.0.1:8080/realms/plone/
客户端 ID: plone
警告:此属性必须与Keycloak中设置的客户端ID匹配。
客户端密钥: ••••••••••••••••••••••••••••••••
警告:此属性必须与Keycloak中获取的客户端密钥匹配。
使用已弃用的退出重定向URI url(/Plone/acl_users/oidc/logout)被选中。如果需要运行旧的Keycloak版本,请使用此选项。
请求服务器的Open ID作用域:这取决于您使用Keycloak的版本以及那里可用的作用域。在较新的Keycloak版本中,您必须包括openid作为作用域。建议使用openid和profile。
提示:除非您知道自己在做什么,否则请保留其他设置不变。
点击保存。
Plone配置完成!
查看这个截图
警告
注意,在Keycloak 18之前,退出参数为redirect_uri,自18版起已弃用。但如果需要,Keycloak服务器可以使用redirect_uri运行,也可以启用插件中的旧版redirect_uri参数。问题是,如果插件中启用了已弃用的参数但服务器中没有启用,则插件将无法工作。
所以,这是它的工作方式
在Keycloak中启用了旧版redirect_uri参数时,插件以默认模式工作。
在Keycloak中启用了旧版redirect_uri参数时,插件也可以以旧版模式工作。
在Keycloak中禁用了旧版redirect_uri参数(自18版起默认值),插件以默认模式工作。
在Keycloak中禁用了旧版redirect_uri参数(自18版起默认值),插件不以旧版模式工作。
因此,对于Keycloak,如果Keycloak以旧版模式运行,则使用默认模式或旧版模式无关紧要。
备注
如果Keycloak中禁用了旧版redirect_uri参数,这是从Keycloak 18版以来的默认值,如Stack Overflow中的此评论所述: https://stackoverflow.com/a/72142887。
只有当在插件属性https://127.0.0.1:8081/Plone/acl_users/oidc/manage_propertiesForm中取消选中“使用已弃用的退出重定向URI url(/Plone/acl_users/oidc/logout)”选项时,插件才能正常工作。
登录
转到另一个浏览器,或者从Keycloak管理员控制台注销管理员用户。目前,Plone登录表单没有改变。
相反,为了测试,请访问插件的登录页面:https://127.0.0.1:8081/Plone/acl_users/oidc/login,这将带您到Keycloak进行登录,然后返回。如果您在Keycloak中设置了这些信息,现在应该已经登录到Plone,并看到全名和电子邮件。
注销
如果登录如预期那样工作,您可以尝试从Plone注销。目前,Plone注销表单没有改变。
相反,为了测试,请访问插件的注销页面:https://127.0.0.1:8081/Plone/acl_users/oidc/logout,这将带您到Keycloak注销,然后返回到注销后的重定向URL。
登录过程中的会话使用
此插件在登录过程中使用会话来识别用户在前往OIDC提供者和从那里返回时的身份。
插件有两种处理会话的方式
使用Zope会话管理:如果插件配置中的“使用Zope会话数据管理器”选项已启用,则插件将使用Zope中配置的会话配置。为此,我们建议使用Products.mcdutils将会话数据保存到基于memcached的存储中。否则,Zope将尝试使用基于ZODB的会话管理,这在过去已经显示出几个问题。
使用基于cookie的会话管理:如果插件配置中的“使用Zope会话数据管理器”选项已禁用,则插件将使用cookie将信息保存到客户端的浏览器中。
环境变量中的设置
可选地,您可以通过ZMI编辑您的OIDC提供者设置,也可以使用collective.regenv并提供一个包含设置的YAML文件。如果您在不同的环境中有不同的设置,并且不想每次移动内容时都编辑设置,这非常有用。
Varnish
可选地,如果您在Plone前面使用Varnish缓存服务器,您可能只会看到此插件部分工作。特别是came_from参数可能会被忽略。这是因为来自plone.recipe.varnish的buildout标准配置删除了大多数cookie,以改进匿名缓存。
解决方案是确保将__ac_session cookie添加到cookie-pass选项中。检查当前buildout配方中的默认值,并更新它。
[varnish-configuration] recipe = plone.recipe.varnish:configuration ... cookie-pass = "auth_token|__ac(|_(name|password|persistent|session))=":"\.(js|css|kss)$"
贡献
参考
许可证
本项目采用GPLv2许可证。
贡献者
mamico, mauro.amico@gmail.com
erral, Mikel Larreategi
alecghica, alec.ghica@eaudeweb.ro
macagua, leonardocaballero@gmail.com
变更日志
1.0.0 (2023-11-11)
允许字典实例持有用户信息 [erral]
1.0a6 (2023-07-20)
添加西班牙语翻译 [macagua]
增加了关于国际化支持(i18n)的改进 [macagua]
取消对Python 2.7和Plone 4的支持 [erral]
添加了对注销API中post_logout参数的支持。 [ramiroluz]
1.0a5 (2023-04-05)
在OAuth过程中捕获异常 [erral]
更新插件以生成挑战。访问您需要认证的页面的匿名用户将被重定向到插件的new require_login视图。这和Plone标准require_login页面的工作方式相同。 [maurits]
添加了一个属性来替代仅使用sub的默认userinfo。 [eikichi18]
1.0a4 (2023-01-16)
在获取redirect_uris或scope时只调用getProperty一次。 [maurits]
使用getProperty访问器 [mamico]
1.0a3 (2022-10-30)
移除了硬编码的认证cookie名称 [alecghica]
修复了与版本 >= 3.6的Python兼容性问题 [alecghica]
在重定向之前检查url是否在门户中 #2 [erral]
管理came_from [mamico]
1.0a2 (未发布)
如果存在client.userinfo_endpoint,则执行userinforequest [mamico]
1.0a1 (未发布)
初始发布。 [mamico]
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
pas.plugins.oidc-1.0.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 580ee795ce46988e0a5a0937dd2fd8cc7a187484cad265598877ec48ea6035c6 |
|
MD5 | 15af901f1e1dd480cbbeb6ffc9901e83 |
|
BLAKE2b-256 | 8c2759cf069745edaf6a9199e18d131ecf8f733c0cabc71bc891cb55e672858e |
pas.plugins.oidc-1.0.0-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 174ee4d0f291617cccdbb6aab5f2e98a130ef8b4ce26828d6c26bef7813d3bfb |
|
MD5 | 9f4a2ea7183dcfb7ff05a069e32b3fb4 |
|
BLAKE2b-256 | 048e5c8b1373f9f4e7430b10cca1c3658e155e44d0b0d2cb7f24739466cd06e4 |