如何从OUSIDE WordPress/php验证用户?

时间:2012-01-21 作者:Davos Seaworth

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

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

理论上,这可以通过执行以下操作轻松解决:

wordpress登录期间,一些用户令牌存储在javascript变量中

首先,我考虑将wordpress\\u logged\\u(auth)cookie传输到servlet,并让servlet查询wordpress的auth cookie是否仍然有效。但似乎无法做到这一点,因为wp\\u validate\\u auth\\u cookie()总是失败,即使传递了登录用户的cookie数据。另一个解决方案是开发一个插件,将sessionid和userid存储在一个表中,servlet可以很容易地查询到这个表。或许还有其他解决方案。。。

5 个回复
SO网友:chrisguitarguy

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;
}
这些都是as a plugin. 在您的WP站点上安装并启用了XMLRPC之后,您应该能够使用一些XMLRPC客户端发出请求(我相信Java有一个)。

下面是我用来测试上述内容的代码(Python XMLRPC客户端)。

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

SO网友:laughingbovine

Wordpress(当前)通过检查用户登录时发出的其中一个cookie来检查用户是否仍在登录。它通过做一些散列来构造这个cookie的内容。有关详细信息,请参阅/wp includes/pluggable中的“wp\\u generate\\u auth\\u cookie”函数。php:

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\\u cookie函数)以进行相同的检查。JS可用于确保将cookie发送到servlet。

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

SO网友:Olathe

获取Exec-PHP plugin, 然后用一个好的永久链接创建一个WordPress页面(不是帖子)(http://mysite/user_id/) 以及get_current_user_id() API reference:

<?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是什么。

SO网友:FlashingCursor

您可以在非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
}

?>

SO网友:kYuZz

这是一个单文件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_... 曲奇

然后需要编写一些代码来查询此方法,并将wordpress_logged_in_... 曲奇

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

结束

相关推荐

Cookies in template

我需要根据cookies只显示一次页面的某些部分。主要问题是我只能在插件中设置cookie,挂起init操作。我已经读了20页的谷歌,这个网站,问了2个论坛,但我仍然有这个问题。任何帮助都将不胜感激!