Wordpress和CakePHP之间的单点登录(SSO)

10
我有一个现有的WordPress网站。计划使用cakePHP框架重建该网站。由于时间限制,我想逐个替换WordPress网站的各个部分。这将意味着两个应用程序将在一定时间内并行运行。我需要使用WordPress提供的授权来控制对cakePHP应用程序的访问。我不确定最佳方法是什么。我看到过很多类似的问题,但还没有找到明确的解决方案。
我的想法有两种方法:
计划A: 1. 配置Cake以查找WordPress的授权Cookie。 2. 配置Cake以查看WordPress的数据库。 3. 借鉴WordPress的授权逻辑,教导Cake的Auth组件如何验证WP用户。
计划B: 1. 在我的WordPress网站上设置授权API。 2. 在cake中设置单独的auth组件。 3. 当用户访问cake应用程序中受保护的页面时,ping WP终端点,然后手动登录用户。(这将创建第二组auth cookies)
这两种方法哪种更合适?有更好的方法吗?

有用的参考资料:关于Cake会话处理的文章, Cake Auth组件文档, Cake Auth教程, WP授权简要概述, 更深入地了解WordPress授权

更新 我们已经开始着手处理这个问题,看起来会奏效,但是密码哈希方面有一个非常棘手的问题,需要提出单独的问题。如果您正在关注此线程,您可能需要查看一下。

3个回答

11

我曾经有过类似的情况:Zend + Codeigniter 跨框架身份验证,这是几个月前的事情...

无论如何,这是我想要的:

  • 在我的WordPress网站上设置授权API。
  • 在Cake中设置单独的auth组件。
  • 当用户访问cake应用程序中的受保护页面时,ping WP端点,然后手动登录用户。 (这将创建第二组身份验证cookie)

在这里,我建议稍作更改,这是可行的。

确保您拥有SSO的令牌系统。 也就是说,当人们登录WordPress时,设置另一个带有标记的cookie:Token将是用户名+密码(哈希)+秘密密钥,它将在WordPress和CakePHP之间相同。 在任一网站上,查找cookie并手动登录用户或仅执行数据库查找。 对那个cookie进行哈希很重要! 但是,如果该站点使用不同的域,则您可能需要重新制定策略:

我曾经有过不同的域名。 在登录或未经授权的页面上,我会ping其他网站并显示其登录框。 在另一个网站上,如果用户已登录,则会获得登录后的页面,如果请求URI发送了令牌,则我们执行正常操作并将授权令牌返回给此(当前)域。

简单说:

网站A = WordPress&网站B = CakePHP

当需要授权时,Site B访问一个页面,则向Site A发出登录请求(类似于使用Facebook登录),其中将通过Token(私钥)和REQUEST_URI请求SSO验证表在Site A上,如果该人已经登录,则Site A将返回一个令牌(通过POST方式)。然后再使用Site B的私钥解密该令牌并将用户登录。 Site B和A的私钥将是相同的。

希望这样可以理解。

有问题吗? :)

回答您在评论中提出的问题:

理想情况下,我们为什么要使用SSO?因为有很多限制。例如:你拥有一个包含一百万行、超过一千个表格的数据库,并需要在已有的大型应用程序上添加一个模块...所以,相反地,你将会使用另一个数据库... SSO 将返回用户信息,这些信息可以进一步复制。例如,当你点击“使用 Facebook 登录”时,它会返回请求的信息,如电子邮件地址、用户名或甚至是个人资料图片。这些信息可以进一步添加到我们的数据库中...强烈建议保留不同的数据库 :)
对于你的第二和第三个问题:这两个站点是否应该引用数据库中的同一用户表? 建议使用不同的数据库,除非你正在使用相同的数据。或者说改变软件平台。 我是否应该将特定于站点的用户行复制到每个应用程序的单独用户表中?是的,应该自动发生这种情况。一旦你在主站点注册,什么都不会发生,在你已经登录并转到B站点之后事情就会发生...一旦登录,用户信息总是可以请求的:)这样新站点就会有活跃的用户了!两全其美?
不要让自己陷入如何工作的复杂问题,而应该集中精力在短期内可以实现的目标上。SSO-登录-限制页面-注意登录-要么登录-如果已经登录-获取用户信息-如果用户信息存在-通过次要站点登录或设置新用户信息。完成!
我们开发人员喜欢流程图!不是吗?我刚创造了一个: 自定义单点登录实现的流程图 更多答案: “获取用户信息”阶段是否意味着我们从已登录的站点中获取用户信息,并自动在其他站点创建一个新用户(行)? 理想情况下,你将在允许使用他们的信息之前征得用户的同意,但这取决于你的隐私政策。换句话说,一个网站负责所有的注册/用户创建工作,而另一个网站只等待该用户出现并触发自动创建。或者说,在一个网站上注册时,两个数据库都插入了一个用户行吗?
可以同时拥有这两种方式。在您的网站上注册并进行基于触发器的自动创建取决于您的策略。如果在一个网站上注册时,两个数据库都插入了一个用户行,这将是一种可怕的做法!它将破坏SSO的原则。 SSO的原则是创建一个身份验证家族,可以供用户使用,以便他们不必为不同的网站频繁注册。每次只更新一个数据库,需要时再更新另一个 :) 有疑问? :)

谢谢。这非常接近我一直在研究的策略。我几乎已经实现了登录/注销,但我不确定如何管理注册。您能否请添加一些关于如何处理新用户注册的说明?两个站点是否应该引用数据库中相同的用户表?我是否应该将特定于站点的用户行复制到每个应用程序的单独用户表中? - emersonthis
+1 那个流程图太棒了!我想确保我理解一件事...“获取用户信息”阶段是否意味着我们从已登录的站点中获取用户信息,并自动在另一个站点中创建新用户(行)?换句话说,一个站点处理所有注册/用户创建,而另一个站点只等待该用户出现并触发自动创建。还是在一个站点上注册用户时,两个数据库都会插入一个用户行?我希望我的问题有意义。 - emersonthis
修改了答案,请查看流程图后面 :) - Keval Domadia
1
谢谢。我应该解释一下为什么我问是否要在两个数据库中创建用户行...这个系统将是临时的,而cakePHP应用程序正在建立中。最终,cakePHP应用程序将取代所有的Wordpress功能,因此不再需要SSO(因为cakePHP将是唯一的系统)。出于这个原因,我不想创建一个让cakePHP“依赖”Wordpress的情况。这些信息是否改变了您的建议? - emersonthis
我猜你没有更多的问题了。全额奖励期已过。也许点击打勾? - Keval Domadia
显示剩余2条评论

0
建议:
  1. 如果您正在构建一个封闭系统,意味着您必须登录才能访问站点中的任何有用信息,则可以使用CAS。我知道它主要被大学使用,但对于封闭系统来说,它很有效。

(如果您需要处理匿名用户,则下面的建议可能会有所帮助)

  1. 保持简单,与您计划的A部分类似,有一个cookie(由cake和wordpress可见),仅说明用户是否已登录。cookie应该由cake和WP创建/检查。Cake不需要查看WP的数据库。cookie可以包含每个系统中用户映射的信息。
  2. 有一个中央登录屏幕,类似于CAS的操作方式。但请自己建立。CAS无法处理匿名用户。我正在为工作创建一个中央登录屏幕。这很简单。中央登录屏幕将处理所有身份验证,并创建对WP和cake均可见的cookie。这意味着WP和cake的登录链接将重定向用户到一个公共页面。该链接将需要提供回调URL,以便在用户成功认证后,将其重定向回原始服务。您需要决定一个用于用户认证的中央DB。

cookie方法具有以下优点:

  • 这是一个轻量级的解决方案,可以用开关包装。在WP中,只需将cookie逻辑与wp_options值包装起来即可。
  • 您可以使用WP和cake的身份验证系统。无需使用API和/或会话。不需要通过查看彼此的数据库来耦合应用程序。
  • 您可以保留角色和权限本地化,这意味着WP将使用自己的角色和权限系统,而您的cake应用程序将使用自己的系统。
  • 向平台添加新的“服务”就像“创建/检查cookie”,然后使用系统开箱即用的身份验证系统登录用户一样简单。
  • 单点登录只需创建一个cookie即可。单点注销将删除cookie。

如果您有兴趣,我可以详细介绍每个建议。


0

我曾经做过这个。我没有代码片段和/或任何参考资料。但是我认为这可能会有所帮助。

  1. 配置WP和CakePHP使用相同的会话,您可以通过会话ID和会话名称来实现此目的,

  2. 当用户注册您的网站时,请同时在WP和CakePHP中注册他们,

  3. 选择一个框架来处理前端的登录视图。我选择了CakePHP,因为我更熟悉它,一旦登录成功,在其他框架的数据库中找到相同的用户,并使用其身份验证系统对用户进行身份验证。

希望这可以帮助到您!


这与我尝试做的类似。由于cakePHP允许多个数据库,是否只引用Wordpress的用户表会更简单?还是有其他原因要复制用户行?另外,您能详细说明一下#1吗?我目前已经设置了一个API来从Cake向我的Wordpress网站发送ping请求,如果当前用户已登录到wordpress,则返回true / false。但是我不确定在Cake侧该如何处理这些信息。 - emersonthis
我认为最好的做法是将注册委托给各自的框架。#1基本上意味着你将在Cake和WP之间共享同一个会话。这并不是将Cake和WP集成的必要方面,只是为了共享你可能需要跨它们使用的相关数据。 - Kishor Kundan
你能解释一下为什么使用两个并行注册更好吗?我不是在怀疑,但我想更好地了解原因。至于#1,我理解这个想法,但我不知道从哪里开始配置cake的会话cookie。你知道吗? - emersonthis
我更喜欢保留各自框架的身份验证逻辑。例如,cake有它自己的Auth::password(),我不太记得,但WP也有它自己的哈希方法。这样,如果您因某种原因希望回到任一框架,您将拥有双向兼容的注册方式。此外,我今天相对详细地发布了一个关于会话的帖子,其中包含您需要知道的内容http://stackoverflow.com/questions/15257265/cakephp-2-x-sessions-behaving-inconsistently-between-local-dev-and-production/15287161#15287161 - Kishor Kundan
我刚刚谷歌搜索了 arnd,在使用 WP 时,请务必访问 http://www.kanasolution.com/2011/01/session-variable-in-wordpress/。 - Kishor Kundan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接