Ouside wordpress / php'den bir kullanıcı nasıl doğrulanır?


9

Bir wordpress sayfasına gömülecek bir ajax uygulaması üzerinde çalışıyorum. Ajax uygulaması tomcat üzerinde çalışan sunucu uygulamaları ile veri alışverişi yapar. Şimdi sunucu uygulamacıları, wordpress'e oturum açan bir kullanıcıdan bir istek gelip gelmediğini belirlemek için bir yola ihtiyaç duyar. Kullanıcı oturum açtıysa, veritabanlarının sorgulanabilmesi için sunucu uygulamacıları da kullanıcı kimliğini belirleyebilmelidir. Kullanıcı oturum açmazsa, istek reddedilir.

Başka bir deyişle, bir sunucu uygulamasının yalnızca isteğe neden olan kullanıcı wordpress'e (sürüm 3.3.x) giriş yapmışsa bir istek gerçekleştirmesine izin vermeliyim. Hem sunucu uygulaması (tomcat) hem de wordpress (apache2) aynı fiziksel makinede çalışır ve aynı veritabanını paylaşır.

Teoride bu, aşağıdakileri yaparak kolayca çözülebilir:

  1. Wordpress oturum açma sırasında, bazı kullanıcı belirteci bir javascript değişkeninde depolanır.
  2. Ajax uygulaması kullanıcı belirtecini her çağrıda sunucu uygulamasına iletir.
  3. Sunucu uygulamaları, geçerliyse (yani, kullanıcı oturum açtıysa) wordpress'i sorgulamak ve isteği gerçekleştirmek veya reddetmek için jetonu kullanır.

Soru, bu wordpress tarafında nasıl uygulanabilir?
Çünkü, teoriyi bu kadar karmaşık kılan şey, henüz herhangi bir php programlama yapmadığı gerçeğidir.

İlk olarak wordpress_oked_in (auth) çerezini sunucu uygulamasına iletmeyi ve auth çerezinin hala geçerli olması durumunda sunucu uygulaması sorgulama wordpress'ine izin vermeyi düşünüyordum. Ancak göründüğü gibi, oturum açmış bir kullanıcının çerez verileri iletilse bile wp_validate_auth_cookie () her zaman başarısız olduğundan bu yapılamaz. Başka bir çözüm, oturum kimliği ve kullanıcı kimliğini bir tabloya depolayan ve sunucu uygulamaları tarafından kolayca sorgulanabilen bir eklenti geliştirmek olabilir. Ya da belki başka bir çözüm var ...


Neden AJAX hizmeti olarak kullanıcı kimlik doğrulaması sunan bir eklenti yazmıyor veya kullanmıyorsunuz ? Tüm WP yığınını kullanabilir ve herhangi bir uygulama uygun bir HTTP isteği yayınlayarak kullanabilir. Yine de, kullanıcı kimlik bilgilerinizi uygun şekilde korumaya dikkat edin.
Raphael

Sanırım beni yanlış ifade ettim, ajax kimlik doğrulama hizmetine ihtiyacım yok. İhtiyacım olan bir sunucu uygulaması zaten kimliği doğrulanmış bir kullanıcıyı doğrulamak için izin vermenin bir yoludur. Kullanıcının hala oturum açmış olup olmadığını kontrol edin. Mesele şu: Kullanıcı oturum açar, verileri depolamak / almak için sunucu uygulamasına iletişim kuran bir ajax uygulamasına erişir. Şimdi sunucu uygulamasının 1) isteğin oturum açmış bir kullanıcıdan gelip gelmediğini test etmesi için bir yol bulması ve 2) kullanıcı kimliğini alması (daha fazla veritabanı erişimi için).
Davos Seaworth

Belki de tüm bu yorumları dahil etmek için sorunuzu düzenlemelisiniz. Tercihen probleminizi (!) Ve fikrinizin ne olduğunu gösterin. Özellikle, öngördüğünüz sürecin adım adım açıklamasını verin.
Raphael

Umarım soru şimdi daha açıktır.
Davos Seaworth

bunu nasıl yaptın? çözümünüzü paylaşabilir misiniz? XMLRPC kullandınız mı?
pkyeck

Yanıtlar:


7

WordPress zaten bir XMLRPC sunucusu üzerinden yerleşik bir API'ye sahiptir. Yani, java uygulamanızdan bir XMLRPC isteği yapabilir ve bir kullanıcı adı / şifre doğrulayabilirsiniz. Ne yazık ki, sadece olduğu gibi kimlik doğrulaması yapmanın bir yolu yoktur.

Bununla birlikte, kendi rulolarınızı almak çok kolay. xmlrpc_methodsBir filtreye takıp sizinkini ekleyin. Eklediğiniz dizi anahtarı, uygulamanızdan çağırdığınız xmlrpc yöntemi ve değer, WordPress XMLRPC sunucusu tarafından çağrılan işlev olacaktır.

<?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;
}

Ve geri çağırma işlevi, wpse39662_check_loginXMLRPC sunucusuna gönderilen şeylerin dizisine bir argüman iletir.

<?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;
}

İşte bir eklenti olarak . WP sitenizde yüklü ve XMLRPC etkinken, bazı XMLRPC istemcileriyle istekte bulunabilmeniz gerekir (Java'nın bir tane olduğundan eminim).

Yukarıda test etmek için kullandığım kod (Python XMLRPC istemcisi).

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

1
Teşekkür ederim! Bu bana büyük bir adım daha getiriyor! Aynı şey kullanıcıların yetkilendirme çerezi kullanılarak da gerçekleştirilebilir mi? Yani kullanıcı adını / pwd'yi kablo üzerinden saklamak ve göndermek zorunda değilim? Projem, bir wordpress sayfasına gömülmüş bir ajax uygulamasından oluşuyor. Ajax uygulaması bir sunucu uygulamasını çağırır ve sunucu uygulaması, kullanıcının kimliğinin doğrulanıp onaylanmadığını sorar. Kullanıcı / pwd'yi ajax uygulamasına aktarabilir ve sunucu uygulamasına aktarabilirim, ancak çok güvenli olmayacağından korkuyorum. Bu yüzden wp_validate_auth_cookie () için auth çerezinin içeriğini geçirmeyi denedim ama her zaman başarısız olur.
Davos Seaworth

Ben sadece kullanıcı için bir jeton ya da bir şey oluşturmak ve sistemin her iki ucunda saklamak istiyorum. Ardından jetonu ileri geri aktarın.
chrisguitarguy

2

Wordpress (şu anda), oturum açtıktan sonra verdiği çerezlerden birini kontrol ederek kullanıcının hala giriş yapmış olup olmadığını kontrol eder. Biraz karma yaparak bu çerezin içeriğini oluşturur. Ayrıntılar /wp-includes/pluggable.php içindeki "wp_generate_auth_cookie" işlevindedir:

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);
}

Aynı kontrolleri yapmak için Java kodunuzda bu algoritmayı (bu ve diğer auth_cookie işlevlerini kullanarak) yeniden oluşturabilirsiniz. JS, çerezin sunucu uygulamanıza gönderilmesini sağlamak için kullanılabilir.

Aksi takdirde XMLRPC iyi bir fikir olabilir. Kimlik doğrulama çerezini doğrulamak için yeni bir yöntem (burada başka bir çözümde açıklandığı gibi) yazabilirsiniz (genellikle kullanıcı adı ve şifresini doğrulamak yerine).


2

Exec-PHP eklentisini alın ve ardından güzel bir kalıcı bağlantı ( http://mysite/user_id/) ve get_current_user_id()API referansındaki kodla bir WordPress sayfası (posta değil) yapın :

<?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.'.';
}
?>

Daha sonra istemcinin size gönderdiği çerezleri çıkarabilir ve GETistekte bulunabilirsiniz http://127.0.0.1/user_id/. Ardından kullanıcının oturum açıp açmadığını ve kullanıcı kimliğinin ne olduğunu öğreneceksiniz.


1

Wp olmayan sayfalarda böyle bir şey yapabilirsiniz:

<?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
}

?>

Cevabınız için teşekkürler, sorun şu ki, sunucu uygulamaları java ile yazılıyor, bu yüzden php kodu yürütülemiyor. Ne arıyorum bir sunucu uygulaması / java wordpress / php ile iletişim sağlayan harici arabirim bir türüdür. Kesinlikle bir çeşit arayüz mevcut, onu bulamıyorum ...
Davos Seaworth

Ah, anlıyorum. Belki de Quercus gibi bir şey kullanmak caucho.com/resin-3.0/quercus size her iki dünyanın da en iyisini verebilir mi?
FlashingCursor

Teşekkür ederim, ama quercus yanlış bir çözüm, çünkü zaten çalışan bir wordpress / php / apache ve çalışan bir sunucu uygulaması / java / tomcat kurulumu var. Şimdi ihtiyacım olan tek şey, bu kullanıcı arasında bir kullanıcının wordpress (bazı arayüz / protocoll / ipc / ne olursa olsun) oturum açmış olup olmadığını doğrulamasını sağlayan bu ikisi arasında bir arayüz.
Davos Seaworth

1

Bu, işi yapan tek dosyalı bir WordPress eklentisidir:

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');

Temel olarak WordPress'ten wordpress_logged_in_...çerezi doğrulamasını isteyebileceğiniz yeni bir XML-RPC yöntemi ortaya koyar .

Daha sonra bu yöntemi sorgulamak ve bunu wordpress_logged_in_...çerezin değerini iletmek için bir kod yazmanız gerekir .

Bu yöntem false(çerez doğrulanmazsa) veya doğrulama başarılı olursa kullanıcı kimliğini döndürür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.