2

我希望能够使用这些“同类最佳”的开源解决方案,只需要在不同站点之间进行某种单点登录。我不希望我的用户必须在 3 个不同的地方登录,所以我认为使用 OpenId 是可能的。

有没有人尝试过类似的东西?

4

2 回答 2

2

OpenID 不会避免必须分别登录 3 次的问题。它允许用户在站点之间共享相同的登录凭据,但他们必须实际登录到三个系统中的每一个。如果这不是问题,请使用 OpenID。如果是,您有两种选择:

  1. 使用 LDAP 服务器在所有三个站点上进行身份验证。我认为所有三个软件包都有用于 LDAP 的模块/插件(DrupalMoodleMediaWiki)。一旦你运行了 LDAP 服务器,剩下的就很容易了。

  2. 为针对单个数据库进行身份验证的每个平台编写自定义模块/插件。也许您可以使用 Drupal 数据库作为主要数据库,并让 MediaWiki 和 Moodle 使用它进行身份验证。因此,实际上,用户在 Drupal 站点上只有一个帐户,但可以访问这三个站点。这与 LDAP 服务器的想法基本相同,但可能会为您节省一些开销和复杂性。

还有一个用于 Drupal 的Moodle 集成模块,它试图完成同样的事情,只是没有 MediaWiki 混合。我会检查一下。

祝你好运!

于 2009-11-05T16:50:18.840 回答
2

以下是三种可能的解决方案:(1) 单一登录站点,(2) 使用服务器站点将登录/注册表单注入所有站点,包括 - SSI 和 (3) - ajax。

单点登录网站。

假设你有site1.domain.com并且site2.domain.com你想同时登录/注册。可能最简单的方法是创建另一个域,例如login.domain.com可以完成这项工作。您的登录/注册应用程序将需要访问 site1 和 site2 和/或其 api 的数据库。由于登录状态通常驻留在 cookie 中,因此您的登录应用程序需要同时将这些登录 cookie 设置到两个站点(成功登录/注册时)并在注销时删除。

要为所有站点设置 cookie login.domain.com- 所有必须位于.domain.com且 cookie 域参数必须是.domain.com

如果您的解决方案既需要 api 访问(对其他应用程序)又需要多个应用程序访问同一数据库 - 您可能需要处理数据库事务。这是因为在提交事务之前,新注册不会在其他站点上可见 - 例如 - 在使用新注册提交事务之前,您不能从登录代码中调用 api 来检索 cookie。

一个重要的细节。如果您已经在站点 1 和/或站点 2 上分别注册了用户,但没有同时在两个登录站点上注册,则您必须处理这些情况,或者您需要在部署新注册系统时自己手动同步注册。当需要额外的用户输入来完成跨站点注册时,将无法手动修复。当您添加需要一些新用户输入以进行注册的新站点时,这一点也变得很重要。

最后,慎重选择域名处理OpenID。据我所知,未经用户同意,不可能跨子域转移 openid 背书 - 如果我错了,请纠正我。您不想因为您决定重命名子域而要求用户重新注册。

服务器端包含(ssi)方法

另一种解决方案是通过服务器端包含将这些表单注入所有站点。这可能要困难得多,并且取决于所使用的网络服务器的类型,并且工作速度会更慢。

这里的先决条件是您的所有应用程序都在同一个子域上运行 - 以便 openid 对所有应用程序都有效。

我曾经为 MW (php) 和 cnprog (python/django) 建立了通用用户注册。

我的解决方案是在 wiki 和论坛站点上显示完全相同的注册表单,同时使用 django 生成和处理此表单。我这样做是因为 wiki 和论坛“皮肤”是如此不同,以至于当访问者进入注册页面时,我不想让访问者因网站外观的巨大变化而感到惊讶。这很复杂,我不会再这样做了:),而是使用单点登录方法。

为了通过 mediawiki 显示 django 输出,我创建了一个 wiki 扩展打印 apache“include virtual”调用,以将 django 生成的内容与 wiki 输出粘合。这带来了问题。

我安装的 Apache 包含虚拟无法 POST 到子请求,也无法从子请求传递 cookie,也无法将重定向响应(所有 http 标头都将被丢弃)传递给上游用户请求。

所以我添加了“was_posted=true”来标记 django 的帖子和一个防止跨站点伪造的密码。把饼干拿出来——让它们在 python 中用 cookie_morsel.output_js() 打印出来。因此,javascript 必须在客户端上运行才能正常工作。任何重定向也必须使用 javascript 完成。上传文件(如头像图片)仍需要额外的工作。

所以单点登录可能是最好的解决方案。

ajax可能是一种巧妙的方法 - 只需使用 javascript 在您的所有站点中构建表单并通过 ajax 提交它们。工作速度很快,不会破坏您的各种网站的外观,但这不会取悦对 javascript 过敏的人。

实际上,唯一不需要任何 javascript 的方法是单点登录站点。

发布这个是因为我已经花了足够的时间为 MW 和 django 构建这个东西 - 一个小时的打字并没有什么不同:)。

于 2010-01-09T22:42:19.717 回答