如何从ouside wordpress / php验证用户?


9

我正在研究将嵌入在wordpress页面中的ajax应用程序。Ajax应用程序与在tomcat上运行的servlet交换数据。现在,Servlet需要一种方法来确定是否来自登录到wordpress的用户的请求。并且,如果用户已登录,则servlet还必须能够确定用户ID,以便能够查询数据库。如果用户未登录,则该请求将被拒绝。

因此,换句话说,仅当导致请求的用户登录到wordpress(3.3.x版)时,才需要让servlet执行请求。servlet(tomcat)和wordpress(apache2)都在同一台物理计算机上运行并共享同一数据库。

从理论上讲,可以通过以下操作轻松解决:

  1. 在wordpress登录期间,一些用户令牌会存储在javascript变量中。
  2. 每次调用时,ajax应用程序都会将用户令牌转发给servlet。
  3. servlet使用令牌查询wordpress是否有效(即,如果用户已登录),并执行或拒绝该请求。

问题是如何在wordpress方面实现呢?
因为,使该理论如此复杂的是我还没有完成任何php编程的事实。

首先,我正在考虑将wordpress_logged_in(auth)cookie传输到servlet,并让servlet查询authpress是否仍然有效的wordpress。但是看起来似乎无法完成,因为wp_validate_auth_cookie()总是失败,即使传递了已登录用户的Cookie数据也是如此。另一个解决方案是开发一个插件,该插件将sessionid和userid存储在一个表中,而servlet可以很容易地查询该插件。也许还有其他解决方案...


为什么不编写或使用提供用户身份验证作为AJAX服务的插件?它可以使用整个WP堆栈,任何应用程序都可以通过发出适当的HTTP请求来使用它。但是,请小心保护用户的凭据。
拉斐尔2012年

我想我说错了,我不需要ajax认证服务。我需要的是一种允许Servlet验证已经通过身份验证的用户的方法。即验证用户是否仍在登录。关键是:用户登录并访问ajax应用,该应用与servlet进行通信以存储/检索数据。现在,该Servlet需要某种方式来进行以下操作:1)测试请求是否来自已登录的用户,以及2)检索用户ID(用于进一步的数据库访问)。
达沃斯·西沃思

也许您应该编辑问题以纳入所有这些评论。最好提出您的问题(!)以及您的想法。特别是,对您所设想的过程进行清晰的逐步说明。
拉斐尔2012年

我希望这个问题现在更加清楚。
达沃斯·西沃思2012年

您最终是怎么做到的?您可以分享您的解决方案吗?您是否使用过XMLRPC?
pkyeck

Answers:


7

WordPress已经具有通过XMLRPC服务器内置的API。意思是,您可以从Java应用程序发出XMLRPC请求,并验证用户名/密码。不幸的是,没有办法直接通过它进行身份验证。

就是说,自己动手很容易。只需加入xmlrpc_methods过滤器,然后添加您的过滤器即可。添加的数组键是您从应用程序调用的xmlrpc方法,而值将是WordPress XMLRPC服务器调用的函数。

<?php
add_filter('xmlrpc_methods', 'wpse39662_add_login_method' );
/**
 * Filters the XMLRPC methods to allow just checking the login/pass of
 * a given users
 */
function wpse39662_add_login_method( $methods )
{
    $methods['wpse39662.login'] = 'wpse39662_check_login';
    return $methods;
}

然后,回调函数wpse39662_check_login将会传递一个参数,即发送到XMLRPC服务器的一组东西。

<?php
function wpse39662_check_login( $args )
{
    $username = $args[0];
    $password = $args[1];

    $user = wp_authenticate( $username, $password );

    if( is_wp_error( $user ) )
    {
        return false;
    }
    return true;
}

这就是插件的全部内容。安装了该程序并在WP站点上启用了XMLRPC之后,您应该能够使用某些XMLRPC客户端发出请求(我确定Java拥有一个)。

这是我用来测试上述代码的代码(Python XMLRPC客户端)。

>>> import xmlrpclib as xmlrpc
>>> s = xmlrpc.ServerProxy('http://wordpress.dev/xmlrpc.php')
>>> s.wpse39662.login('admin', 'password')
True

1
谢谢!这使我迈出了一大步!可以使用用户身份验证cookie来实现吗?因此,我不必通过网络存储和发送用户名/密码?我的项目包括一个嵌入到wordpress页面中的ajax应用。ajax应用程序调用servlet,并且servlet询问wordpress用户是否已通过身份验证。我可以将user / pwd传递给ajax应用并将其传递给servlet,但是我担心那不是很安全。因此,我尝试将auth cookie的内容传递给wp_validate_auth_cookie(),但始终失败。
达沃斯·西沃思2012年

我只是为用户生成令牌或其他东西,并将其存储在系统的两端。然后来回传递令牌。
chrisguitarguy 2012年

2

WordPress(当前)通过检查用户在登录时发出的cookie之一来检查用户是否仍在登录。它通过执行一些散列来构造此Cookie的内容。详细信息在/wp-includes/pluggable.php中的“ wp_generate_auth_cookie”函数中:

function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') {
    $user = get_userdata($user_id);

    $pass_frag = substr($user->user_pass, 8, 4);

    $key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
    $hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);

    $cookie = $user->user_login . '|' . $expiration . '|' . $hash;

    return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme);
}

您可以在Java代码中重新创建此算法(使用此算法和其他auth_cookie函数)以进行相同的检查。JS可以用来确保cookie被发送到您的servlet。

否则,XMLRPC可能是一个好主意。您可以编写一个新方法(如此处另一个解决方案中所述)来验证auth cookie(而不是像通常那样验证用户名和密码)。


2

获取Exec-PHP插件,然后制作一个带有漂亮的永久链接(http://mysite/user_id/)和get_current_user_id()API参考上的代码的WordPress页面(而不是帖子):

<?php
$user_id = get_current_user_id();
if ($user_id == 0) {
    echo 'You are currently not logged in.';
} else {
    echo 'You are logged in as user '.$user_id.'.';
}
?>

然后,您可以提取客户端发送给您的Cookie,并将其放入的GET请求中http://127.0.0.1/user_id/。然后,您将知道该用户是否已登录以及他们的用户ID是什么。


1

您可以在非wp页面上执行以下操作:

<?php
require('./wp-blog-header.php');
// Make sure ^ points to the root of your WP installation

if ( is_user_logged_in() ) {
   // Perform your request here
}

?>

感谢您的答复,问题是servlet是用Java编写的,因此无法执行php代码。我正在寻找的是某种允许servlet / java与wordpress / php通信的外部接口。肯定有可用的某种界面,我只是找不到它...
达沃斯·西沃思

知道了 也许使用Quercus caucho.com/resin-3.0/quercus这样的东西可能会让您两全其美?
FlashingCursor 2012年

谢谢,但是quercus是错误的解决方案,因为我已经有一个正常的wordpress / php / apache和一个正常的servlet / java / tomcat安装。现在,我唯一需要的是这两者之间的接口,该接口使Servlet可以验证用户是否已登录到wordpress(某些接口/ protocoll / ipc /任何接口)。
达沃斯·西沃思

1

这是一个完成工作的WordPress单文件插件:

function yournamespace_validateAuthCookie($cookie, $scheme = 'logged_in') {
    return wp_validate_auth_cookie($cookie, $scheme);
}

function yournamespace_new_xmlrpc_methods($methods) {
    $methods['yournamespace.validateAuthCookie'] = 'yournamespace_validateAuthCookie';
    return $methods;
}
add_filter('xmlrpc_methods', 'yournamespace_new_xmlrpc_methods');

它基本上公开了一种新的XML-RPC方法,您可以使用该方法要求WordPress验证wordpress_logged_in_...cookie。

然后,您需要编写一些代码来查询此方法,并向其传递wordpress_logged_in_...cookie 的值。

false如果验证成功,则此方法将返回(如果cookie不验证)或用户ID。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.