将Drupal + Moodle + MediaWiki与OpenID集成

时间:2009-11-05 11:25:21

标签: drupal openid single-sign-on mediawiki moodle

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 使用LDAP服务器对所有三个站点进行身份验证。我认为这三个软件包都有LDAP模块/插件(DrupalMoodleMediaWiki)。运行LDAP服务器后,其余部分应该很简单。

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

  3. Drupal还有Moodle Integration module尝试完成同样的事情,只是没有MediaWiki。我会检查一下。

    祝你好运!

答案 1 :(得分:2)

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

单点登录网站。

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

要为login.domain.com的所有网站设置Cookie,所有网站都必须位于.domain.com,Cookie域参数必须为.domain.com

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

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

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

服务器端包含(ssi)方法

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

这里的先决条件是所有应用程序都在同一个子域上运行 - 这样openid适用于所有应用程序。

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

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

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

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

所以我添加了“was_posted = true”来标记django的帖子和一个密码以防止跨站点伪造。为了获取cookie - 在python中使用cookie_morsel.output_js()打印它们。所以javascript必须在客户端上运行才能实现。任何重定向都必须使用javascript完成。上传文件仍然需要额外的工作(如头像图片)。

因此,单点登录可能是最佳解决方案。

ajax 可能是一个简洁的方法 - 只需使用javascript在您的所有网站中构建表单并通过ajax提交它们。工作速度快,不会打破各个网站的外观, 但这不会让那些对javascript过敏的人感到高兴。

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

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