来自其他webapp的基于WordPress的身份验证

时间:2015-01-22 13:13:05

标签: wordpress cookies hash vaadin

任务

我想创建一个webapp,可能在Vaadin中,我想在WordPress网站的管理区域内使用它。大多数事情都很清楚:

  • 我可以创建一个WP插件,它会在WP管理员的iframe中显示我的Vaadin应用程序。
  • 该插件可以在WP管理员内创建菜单。

BUT

我不完全确定,我如何验证我的用户身份。我想使用WordPress的auth系统。如果我的用户登录到WP站点并且具有管理员权限,我想向他们显示我的站点。否则,我想抛出HTTP404,或者其他什么。

我已经完成了什么

我已经检查了WordPress创建的cookie。当我登录我的网站时,我发现创建了2个cookie,名为:

  • wordpress_HASH
  • wordpress_logged_in_HASH

其中HASH是网站网址的md5哈希值。

Theese cookies看起来像这样:

  • wordpress_HASH
    管理员%7C1422101199%7Ckd5Qp39eAQc4JNZTUBxlSjAMKeQqdCX00l6bnc64dxu%7C3f19a3dd6e12f7c342059a40c7ffe64b923dc9f46707d67d303b0a8333344818
  • wordpress_logged_in_HASH
    管理员%7C1422101199%7Ckd5Qp39eAQc4JNZTUBxlSjAMKeQqdCX00l6bnc64dxu%7Cdf8a63d871c0830ef98732e7deb68b28b58a8618bc7c42e36a1e26a13494f1ae

我发现了这个:

  • 7C%是分隔符,代表|
  • 此值的第一部分是用户名。在当前案例中称为管理员。
  • 第二部分(1422101199)是一个Unix时间戳,它是cookie的实验日期。
  • 第三部分(kd5Qp39eAQc4JNZTUBxlSjAMKeQqdCX00l6bnc64dxu)是一个sessionId。
    • 我不完全确定,它是如何产生的。它是随机的吗?
    • 我发现在wp_usermeta表下的DB中是sha256哈希。有一行,我的用户使用外键(在这种情况下是管理员),带有meta_key session_tokens。它的值是一个类似JSON的字符串,它包含一些关于用户的数据:他的浏览器,实验时间和所有当前使用的sessionId的哈希值。这个字符串是什么?我怎么解析这个?这不完全是JSON。
  • 还有第四部分,两个饼干不同。关于这到底是什么,我一直都不知道。

我的想法

我的想法是从我的应用程序解析这个cookie,并将它的数据与数据库中的数据进行比较。但是我有很多问题。

  • 安全吗?
  • 有没有更好的方法?
  • 为什么有两个饼干?它们之间有什么区别?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您只是从cookie中读取用户名,恶意用户可以猜测或检测用户名并伪造该cookie并可能获得对基于Vaadin的部分的访问权。

如果您想要一个简单而安全的解决方案,您可能希望使用Quercus在JVM上托管您的wordpress。我在一个网站上做这个并且它工作得很好,实际上比基本的LAMP堆栈(没有php加速器)更快。然后,您可以在WP中创建adds stuff to java session

的挂钩

另一个简单而安全的方法是从Java以某种方式访问​​php会​​话。我不知道从JVM读取基本的PHP会话数据是多么容易,但似乎有php session serializing的某种替代xml(WDDX)格式。这应该很容易在Java中处理 - 假设您可以从servlet中读取会话cookie。最后一个选项是将一个随机哈希值存储到另一个熟的和相应的数据(至少用户名)到某个flatfile或WP数据库(你可能会使用它)。

答案 1 :(得分:0)

情景1

根据我对您的要求的了解,这是我能提出的最明显,最安全的方法。在你的WordPress插件的PHP中:

if ( current_user_can( 'manage_options' ) ) {
    $iframe = "<iframe src='YourJavaApplet.html'></iframe>";
    echo $iframe;
} else {
    echo "Sorry, you're not authorized to view my applet";
}

情景2

此方案假设您以某种方式需要将信息传递到Java applet,而您无法使用方案1中的方法(我无法想象为什么)。 假设您只是想确保“某人”已登录,并且您并不真正关心谁,只要他们具有管理员权限,那么在PHP中您可以执行以下操作:

if ( current_user_can( 'manage_options' ) ) {
    $is_admin = 1;
} else {
    $is_admin = 0;
}

现在,假设您正在使用PHP构建和输出iframe,因此可以修改> iframe中的内容,您可以执行以下操作:

<iframe>
<APPLET code="YourApplet.jar" width="300" height="50">
<PARAM name="admin" value="<?php echo $is_admin ?>">
</APPLET>
</iframe>

现在,您将能够在Java小程序中访问参数“admin”的值。

SCENARIO 2.5

如果您还需要识别有关用户的信息,例如电子邮件地址,那么您可以将其添加到第一段代码中:

$current_user = wp_get_current_user();
$email = $current_user->user_email;

然后将其添加到代码的第二位:

<PARAM name="email" value="<?php echo $email ?>">

现在您可以访问用户的电子邮件地址。

重要的是要注意,如果您决定采用这种方式,可能存在严重的安全隐患,但由于您正在处理客户端小程序,因此您的选项非常有限保护它。