跳转到主要内容

Plone的插件

项目描述

Latest Version Egg Status Supported - Python Versions License Tests Coverage

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

    • 客户端 IDplone

    • 将“始终在控制台显示”设置为“开”,适用于测试

    • 单击“下一步”并单击“保存”。

  • 现在您可以填写“设置” -> “访问设置”。我们将假设 Plone 在端口 8081 上运行

    • 根 URLhttps://127.0.0.1:8081/Plone/

    • 主页 URLhttps://127.0.0.1:8081/Plone/

    • 有效的重定向 URIhttps://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/

    • 客户端 IDplone

      警告:此属性必须与Keycloak中设置的客户端ID匹配。

    • 客户端密钥: ••••••••••••••••••••••••••••••••

      警告:此属性必须与Keycloak中获取的客户端密钥匹配。

    • 使用已弃用的退出重定向URI url(/Plone/acl_users/oidc/logout)被选中。如果需要运行旧的Keycloak版本,请使用此选项。

    • 请求服务器的Open ID作用域:这取决于您使用Keycloak的版本以及那里可用的作用域。在较新的Keycloak版本中,您必须包括openid作为作用域。建议使用openidprofile

    • 提示:除非您知道自己在做什么,否则请保留其他设置不变。

    • 点击保存

Plone配置完成!

查看这个截图

docs/screenshot-settings.png

警告

注意,在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管理员控制台注销管理员用户。目前,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许可证。

贡献者

变更日志

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 (142.6 kB 查看哈希)

上传时间

构建分布

pas.plugins.oidc-1.0.0-py3-none-any.whl (37.9 kB 查看哈希)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面