ouside wordpress / phpからユーザーを検証する方法は?


9

私はワードプレスページに埋め込まれるajaxアプリケーションに取り組んでいます。ajaxアプリは、tomcatで実行されているサーブレットとデータを交換します。これで、サーブレットには、ワードプレスにログインしているユーザーからのリクエストかどうかを判別する方法が必要になります。また、ユーザーがログインしている場合、サーブレットは、データベースを照会できるようにするために、ユーザーIDも判別できる必要があります。ユーザーがログインしていない場合、リクエストは拒否されます。

つまり、言い換えると、リクエストを引き起こしたユーザーがwordpress(バージョン3.3.x)にログインしている場合にのみ、サーブレットにリクエストを実行させる必要があります。サーブレット(tomcat)とワードプレス(apache2)の両方が同じ物理マシンで実行され、同じデータベースを共有します。

理論的には、これは次のようにすることで簡単に解決できます。

  1. ワードプレスログオン中に、一部のユーザートークンがJavaScript変数に保存されます。
  2. ajaxアプリは、呼び出しのたびにユーザートークンをサーブレットに転送します。
  3. サーブレットは、トークンを使用して有効な場合(つまり、ユーザーがログインしている場合)にワードプレスにクエリを実行し、要求を実行または拒否します。

問題は、ワードプレス側でこれをどのように実装できるかということです。
理論が非常に複雑になるのは、私がまだPHPプログラミングを行っていないという事実だからです。

最初に、wordpress_logged_in(auth)cookieをサーブレットに送信し、auth cookieがまだ有効である場合はサーブレットにwordpressを照会させることを考えていました。しかし、ログオンしているユーザーのcookie-dataが渡されたとしても、wp_validate_auth_cookie()は常に失敗するため、これは実行できないようです。他の解決策は、セッションIDとユーザーIDをテーブルに格納するプラグインを開発することです。これは、サーブレットから簡単にクエリできるようになります。または多分他の解決策があります...


AJAXサービスとしてユーザー認証を提供するプラグインを作成または使用しないのはなぜですか?WPスタック全体を使用でき、どのアプリケーションでも適切なHTTP要求を発行することで使用できます。ただし、ユーザーの資格情報を適切に保護するように注意してください。
ラファエル

私は私が間違って言ったと思う、私はajax認証サービスを必要としません。私が必要としているのは、サーブレットがすでに認証されたユーザーを検証できるようにする方法です。つまり、ユーザーがまだログオンしているかどうかを確認します。重要なのは、ユーザーがログインしてajaxアプリにアクセスし、それがサーブレットと通信してデータを保存/取得することです。これで、サーブレットは1)要求がログオンしたユーザーからのものかどうかをテストし、2)ユーザーIDを取得する(さらにデータベースにアクセスする)ための何らかの方法を必要とします。
ダボスシーワース

質問を編集して、それらすべてのコメントを組み込む必要があるかもしれません。できれば、問題(!)と考えを提示してください。特に、想定するプロセスのステップごとの説明を明確にしてください。
ラファエル

質問がもっと明確になれば幸いです。
ダヴォスシーワース2012年

どうやってそれをやったの?ソリューションを共有できますか?XMLRPCを使用しましたか?
pkyeck 2012

回答:


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、それに渡される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

1
ありがとうございました!これは私にさらに大きな一歩をもたらします!ユーザー認証Cookieを使用して同じことを達成できますか?それで、ユーザー名/パスワードを保存して送信する必要はありませんか?私のプロジェクトは、WordPressページに埋め込まれたAjaxアプリで構成されています。ajaxアプリがサーブレットを呼び出し、サーブレットはユーザーが認証されているかどうかをワードプレスに尋ねます。user / pwdをajaxアプリに渡してサーブレットに転送することはできましたが、安全性が低いと思います。そのため、認証Cookieのコンテンツをwp_validate_auth_cookie()に渡そうとしましたが、常に失敗します。
ダボスシー

私はユーザーのためにトークンまたは何かを生成し、システムの両端に保存します。次に、トークンを前後に渡します。
chrisguitarguy 2012年

2

WordPress(現在)は、ユーザーがまだログインしているかどうかを、ログイン時に提供されるCookieの1つをチェックすることによってチェックします。ハッシュを行うことにより、この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がサーブレットに送信されることを確認できます。

それ以外の場合、XMLRPCは良いアイデアかもしれません。(ここで別のソリューションで説明されているように)認証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
}

?>

返信いただきありがとうございます。問題は、サーブレットがJavaで記述されているため、phpコードを実行できないことです。私が探しているのは、サーブレット/ javaがwordpress / phpと通信できるようにする外部インターフェイスの一種です。確かにいくつかの種類のインターフェイスが利用可能ですが、それを見つけることができません...
Davos

ああ、分かった。おそらく、Quercus caucho.com/resin-3.0/quercusのようなものを使用すると、両方の世界で最高のものになるでしょうか?
FlashingCursor

ありがとうございます。ただし、wordpress / php / apacheとservlet / java / tomcatが正常にインストールされているため、quercusは間違ったソリューションです。今必要なのは、これら2つの間のインターフェースだけです。これにより、サーブレットは、ユーザーがワードプレスにログインしているかどうかを確認できます(インターフェース/ protocoll / ipc /何でも)。
ダボスシーワース2012年

1

これは、仕事をする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_...Cookieの検証をWordPressに要求できる新しいXML-RPCメソッドを公開します。

次に、このメソッドをクエリしてwordpress_logged_in_...Cookieの値を渡すためのコードを記述する必要があります。

このメソッドはfalse、Cookieが検証されない場合)または検証が成功した場合はユーザーID を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.