私はワードプレスのページに埋め込まれるajaxアプリケーションに取り組んでいます。 ajaxアプリは、Tomcat上で実行されているサーブレットとデータを交換します。現在、サーブレットには、ワードプレスにログインしているユーザーからの要求があるかどうかを判断する方法が必要です。また、ユーザーがログインしている場合、サーブレットはデータベースに照会できるようにするためにユーザーIDを特定できなければなりません。ユーザーがログに記録していない場合、要求は拒否されます。
つまり、要求を引き起こしたユーザーがwordpress(バージョン3.3.x)にログインしている場合にのみ、サーブレットに要求を実行させる必要があります。サーブレット(Tomcat)とワードプレス(Apache2)はどちらも同じ物理マシン上で実行され、同じデータベースを共有します。
理論的には、これは次のようにすることで簡単に解決できます。
問題は、これをワードプレス側でどのように実装できるかということです。
なぜなら、理論をそれほど複雑にしているのは、私がまだphpプログラミングをしていないという事実です。
最初は、wordpress_logged_in(auth)cookieをサーブレットに送信し、auth cookieがまだ有効な場合はサーブレットにwordpressを照会させることを考えていました。ただし、ログオンしているユーザーのcookie-dataが渡されたとしても、wp_validate_auth_cookie()は常に失敗するため、これは不可能です。他の解決策としては、sessionidとuseridをテーブルに格納するプラグインを開発することが考えられます。これは、サーブレットから簡単に問い合わせることができます。または他の解決策があるかもしれません...
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
は、引数を1つ受け取り、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
Exec-PHPプラグイン を入手して、Niceパーマリンク(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を抽出して、それらをhttp://127.0.0.1/user_id/
のGET
リクエストに含めることができます。これで、ユーザーがログインしているかどうか、そしてそのユーザーIDがわかります。
Wordpressは(現在)ログイン時に提供するクッキーの1つをチェックすることによって、ユーザーがまだログインしているかどうかをチェックします。それはいくつかのハッシュをすることによってこのクッキーの内容を構成します。詳細は/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がサーブレットに送信されるようにすることができます。
それ以外の場合はXMLRPCをお勧めします。 (通常行われているようにユーザー名とパスワードを検証するのではなく)認証Cookieを検証する(ここで別の解決策で説明するように)新しい方法を書くことができます。
これは仕事をする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');
それは基本的にあなたがwordpress_logged_in_...
クッキーを検証するようにWordPressに頼むことができる新しいXML-RPC方法を公開します。
その後、このメソッドを照会してwordpress_logged_in_...
cookieの値を渡すためのコードを書く必要があります。
このメソッドはfalse
(Cookieが検証されない場合)または検証が成功した場合はユーザーIDを返します。
あなたは非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
}
?>