简单/oidc-sso

Wordpress 单点登录 OpenID Connect

安装: 94

依赖: 0

建议者: 0

安全: 0

星星: 10

关注者: 4

分支: 2

开放问题: 0

类型:wordpress-plugin

0.4.1 2019-05-02 19:25 UTC

This package is auto-updated.

Last update: 2024-09-29 05:01:51 UTC


README

这是一个为 Wordpress 定制的 OpenID Connect 单点登录插件,在许多方面类似于 daggerhart/openid-connect-generic,但在目的上有一些关键的不同。具体来说:

  • 它旨在由 前端 用户(例如 LearnDash、Woocommerce 等)使用,而不是后端用户。因此,它始终重定向到登录/注销的原页,并在可能的情况下始终不向用户显示错误消息。

  • 它的目的是完全 替换 WordPress 的登录系统,而不是补充它,禁用任何非通过身份提供者完成的登录或注册。来自身份提供者的属性会覆盖在 WordPress 中设置的属性,每次 用户登录时都会如此。如果用户想更改他们的电子邮件地址、姓名、昵称等,他们必须在 IdP 中更改,否则它将被重置。

    (这是按设计意图:如果您一开始就想通过 IdP 进行单点登录,您希望这些信息在共享登录的网站之间保持一致。)

它还增加了一些小功能,如:

  • 更复杂的用户信息映射:除了 {fieldname} 之外,您还可以使用 {fieldA|fieldB:5} 来获取 fieldA 的内容或 fieldB 的前 5 个 Unicode 字符。您还可以使用 || 在更高层次上分隔替代项,例如将 displayname 格式设置为 {user_alias}||{given_name} {family_name:1}.,以便将人员的显示名称设置为他们的 user_alias 属性或他们的名字和姓氏的首字母。

    您还可以使用 random 字段在用户的登录名中包含一个随机值,例如 random:5 以生成一个随机的 5 位十六进制字符串作为用户的登录名。(去重是自动的。)由于用户永远不会用它来登录,因此它避免了将用户的登录或永久链接与任何个人身份信息(如他们的姓名或电子邮件地址)相关联。

  • 自动会话扩展,以确保会话在 auth_cookie_expiration 之后不会注销,只要用户足够频繁地访问网站以避免刷新令牌超时。

  • 在加载其他插件之前处理令牌刷新,以避免为超时或无效的会话生成注销事件或可见效果。

  • 您可以通过将参数添加到 login_url() 中向 IdP 传递参数:既包括标准定义的 promptmax_agelogin_hintui_locales,也包括 Keycloak 特定的 kc_idp_hint

  • WordPress 的用户注册 URL 将重定向到您的 IdP 登录页面(或者如果您正在使用 Keycloak、AWS 或其他具有注册流程的 IdP,则可以重定向到注册流程)。

  • 一个实验性的“静默登录”功能允许用户在相同的浏览器中已经登录到 IdP 的情况下自动登录到 WordPress。

  • 用于要求登录状态的刷新的API(例如,用于账户管理页面、下单等):oidc_sso\Plugin::recent_login($timeout=3600, $redirect=true)如果用户自上次登录以来时间超过$timeout,将跳转至登录页面。如果会话足够新,则返回true,否则返回false。如果会话太旧,且$redirect为true,并且安全进行跳转,则函数将进行跳转并退出而不返回。 (此API的目的是实现类似Github风格的“sudo模式”或Amazon允许长时间浏览但要求在更安全的页面进行最近登录的功能。)

它不支持以下特性,这是设计决定的

  • 将站点设为私有(有其他插件可以实现这一点)
  • 不会链接现有用户,或通过电子邮件地址或IdP主题身份以外的任何方式链接他们
  • 禁用SSL验证(这是一个极其糟糕的想法)
  • 可用的操作和过滤器不同,并且仍可能发生变化。通常,与在插件内进行过滤相比,更推荐对插件进行API调用,并且更推荐使用具有更多参数的单个共享钩子,而不是类似事件的多个变体。(例如,有一个oidc_sso_userdata过滤器,用于在用户到达Wordpress之前修改来自IdP的用户数据,无论用户是新用户还是现有用户,而不是三个不同的动作钩子。)

它还有以下要求,这些要求目前并非Wordpress插件典型

  • 必须使用基于Composer构建的WP站点(例如,使用bedrock),并使用Composer安装插件,因为它使用Composer自动加载而不是注册自己的自动加载器。
  • 需要现代的PHP版本:5.2是行不通的。(我正在针对7.1进行测试,我正在做的大部分工作至少需要5.5,如果不是5.6。)

问题

此代码应被视为alpha版本:即,仅适用于开发者测试。一些需要注意的问题

  • 错误处理非常基本。您需要过滤oidc_sso_error_loggeroidc_sso_error_logger,以便在除了error_log()wp_die()之外执行任何操作。在令牌刷新过程中出现错误时,将调用记录器,但用户会静默注销,而不会显示任何错误信息。(尽管可以通过适当的记录器函数更改此行为。)
  • 代码没有文档说明,并且缺少任何自动化测试。

待办事项

错误处理

可能发生很多种错误

  • IdP可用性错误,如超时、503等
  • IdP限制错误,如拒绝访问、同意、未经授权的客户端、无法获取用于用户字段的所需数据等
  • 指示要么是黑客攻击(CSRF、重放、欺骗等)要么是状态损坏(被拒绝的cookie、过期的cookie、在其他标签页/窗口中的陈旧页面)等的错误

在UI中,每种类型的错误都需要不同的处理,包括尽可能的选项,转到同一页面或重定向目标页面或主页。(这不应该是通过“后退”来完成的,因为历史记录很可能包括IdP登录或注册页面。请注意,一些这些错误发生在重定向端点而不是在插件对IdP查询响应时。)

在刷新令牌时,通常不应显示错误,并且用户会静默注销。虽然这可能导致由于IdP的暂时可用性问题而导致用户注销,但我们主要假设IdP与Wordpress站点位于同一数据中心,并且IdP的重启可能不如Wordpress的重启频繁。这些决定可能不适合更分布式或管理不善的环境。

愿望清单

  • 实际上验证JWT令牌而不是盲目信任它们
  • OIDC发现,这样您只需在配置中输入一个URL