3

我有一个正在使用 Zend Framework 开发的网站。我还在同一台服务器上放置了一个 Wordpress 站点。当我登录到我的 Zend 站点时,是否可以使用任何(例如 AJAX 调用)登录到 Wordpress 站点。

原因:

我在 Zend 网站上有一个 wordpress 博客的链接,当我单击该链接时,它会将我带到 Wordpress 登录页面。

我希望用户以登录用户的身份被带到 wordpress 博客页面链接。

我对此进行了很多研究,但没有找到正确的路径。

谢谢。

4

3 回答 3

0

由于两个站点都在同一台服务器上,因此您可以从 Zend 和 WordPress 访问文件。当您的用户登录到基于 Zend 的站点时,您可以添加一个调用来加载基本的 wordpress 文件,然后使用函数 wp_set_auth_cookie() 将用户登录到 wordpress。

require_once 'wordpress-directory/wp-load.php';
wp_set_auth_cookie( $wp_user_id );

在 Zend 站点上的用户表中,您可以有一个附加列wp_user_id来存储用户的 wordpress 用户 ID,以便您知道传递wp_set_auth_cookie()函数的用户 ID。

如果您也想在这里查看,我用更笼统的术语写了一篇博客文章

于 2013-04-16T05:43:36.630 回答
0

禁止在 2 个不同的域名之间使用 AJAX,您可以使用 PHP 中的 Curl 函数。http://bit.ly/RBGgfp

于 2012-11-03T00:23:33.613 回答
0

您的问题存在安全问题。如何在不实际传递凭据的情况下将凭据从一个网站传递到另一个网站……

您需要某种授权过程,它会告诉 WP 登录到 WP 的用户实际上是已经登录到 Zend 的同一用户。为此,您不能只在从 ZF 到 WP 的 Ajax 调用中传递用户名和密码,因为每个人都可以从缓存的 JS 源代码中获取用户的密码。此外,您不能在 ajax 调用中只传递用户名,因为这样每个人都可以进行这样的 ajax 调用以以其他人身份登录。

一般来说,您应该尽可能限制通过客户端请求 (Ajax) 传递授权。

这样做的一种方法是许多社交网络(即 Facebook)使用的称为 OAuth 的机制。Facebook 使用特殊令牌进行授权,并且在 Facebook 和使用 Facebook 连接机制的网站之间不会传递任何凭据。Facebook 还使用 PHP 的 curl 函数在幕后进行跨服务器调用,因此在客户端不会留下有关授权过程的任何痕迹。

您可以,但您不必使用 OAuth,但如果您这样做,将会获得很好的体验。

您面临的另一个问题是您的 ZF 和 WP 可能在客户端使用不同的授权 cookie。因此,在 ZF 网站上授权用户时,您还需要对负责登录的 WP 页面进行 Ajax 调用,以确保设置了正确的 cookie。

Summa summarum 流程将与此类似(假设已在两个站点上创建了用户帐户):

  1. ZF 网站上的登录用户。
  2. 从 ZF 发出包含用户 ID(例如)的 curl 调用到 WP 页面,该页面将返回某种随机生成的令牌(如果存在具有给定 ID 的用户)。
  3. 一旦您的 curl 调用从 WP 接收到令牌,使用 JS 生成 ZF 网页,该页面对 WP 进行 Ajax 调用(此处解释了如何向 WP 发送 Ajax 调用:http: //codex.wordpress.org/AJAX_in_Plugins)此 Ajax 调用应该包含类似 md5 散列的用户 ID 和令牌。
  4. 现在在 WP 端,WP 将收到 ZF 的带有散列值的 Ajax 调用。因此,请检查此值是否与 WP 之前返回的用户 ID 和令牌散列后的值相同(在步骤 2 中)。如果是,则登录 WP 站点上的用户。

现在,因为我们不将用户密码从 ZF 发送到 WP(我们在 WP 端也不知道它——因为它是加密的)你不能使用 wp_signon 来登录用户。但是您可以使用 wp_set_auth_cookie 来达到这个特定目的就足够了。

这是一个粗略的解释,但我希望它会有所帮助。

PS wp_login 已弃用,您应该避免使用它。

wp_login 操作也不会调用 wp_set_auth_cookie,这可能是您的用户没有首先显示为已登录的原因。

在其中尝试使用 wp_set_auth_cookie 的解决方案。我在最后这么说,这样你就不会错过上面的安全问题。

于 2012-11-03T00:32:22.490 回答