web-dev-qa-db-ja.com

Wordpress/phpの外部からユーザーを検証する方法

私はワードプレスのページに埋め込まれる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()は常に失敗するため、これは不可能です。他の解決策としては、sessionidとuseridをテーブルに格納するプラグインを開発することが考えられます。これは、サーブレットから簡単に問い合わせることができます。または他の解決策があるかもしれません...

9
Davos Seaworth

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
7
chrisguitarguy

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がわかります。

2
Olathe

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を検証する(ここで別の解決策で説明するように)新しい方法を書くことができます。

2
laughingbovine

これは仕事をする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を返します。

1
kYuZz

あなたは非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
}

?>
1
FlashingCursor