Ouside wordpress / php से यूजर को कैसे वेरिफाई करे?


9

मैं एक अजाक्स एप्लिकेशन पर काम कर रहा हूं जो एक वर्डप्रेस पेज में एम्बेड किया जाएगा। अजाक्स ऐप टॉमकैट पर चलने वाले सर्वलेट्स के साथ डेटा का आदान-प्रदान करता है। अब सर्वलेट्स को यह निर्धारित करने के लिए एक तरीके की आवश्यकता है कि क्या एक उपयोगकर्ता से एक अनुरोध आता है जो वर्डप्रेस में लॉग इन है। और अगर उपयोगकर्ता लॉग इन है, तो डेटाबेस को क्वेरी करने में सक्षम होने के लिए सर्वलेट को भी उपयोगकर्ता आईडी निर्धारित करने में सक्षम होना चाहिए। यदि उपयोगकर्ता इसे लॉग इन नहीं करता है, तो अनुरोध अस्वीकार कर दिया जाएगा।

तो दूसरे शब्दों में, मुझे एक सर्वलेट को केवल एक अनुरोध करने की आवश्यकता है यदि उपयोगकर्ता जो अनुरोध करता है वह वर्डप्रेस (संस्करण 3.3.x) में लॉग इन है। दोनों, सर्वलेट (टॉमकैट) और वर्डप्रेस (एपाचे 2) एक ही भौतिक मशीन पर चलते हैं और एक ही डेटाबेस को साझा करते हैं।

सिद्धांत रूप में यह निम्नलिखित को आसानी से हल किया जा सकता है:

  1. वर्डप्रेस लॉगऑन के दौरान, कुछ उपयोगकर्ता टोकन एक जावास्क्रिप्ट चर में संग्रहीत हो जाते हैं।
  2. Ajax ऐप फॉरवर्ड यूजर को हर कॉल पर सर्वलेट्स के लिए टोकन।
  3. सर्वलेट क्वेरी वर्डप्रेस को टोकन का उपयोग करता है, तो यह मान्य है (यानी अगर उपयोगकर्ता के प्रवेश) और प्रदर्शन या अनुरोध को अस्वीकार।

सवाल यह है कि इसे वर्डप्रेस की तरफ कैसे लागू किया जा सकता है?
क्योंकि, जो सिद्धांत को इतना जटिल बनाता है, वह यह है कि मैंने अभी तक कोई php प्रोग्रामिंग नहीं की है।

पहले मैं wordpress_logged_in (Cort) कुकी को सर्वलेट में प्रसारित करने के बारे में सोच रहा था और सर्वलेट कुकी को अभी भी मान्य होने पर सर्वलेट क्वेरी वर्डप्रेस को जाने दें। लेकिन जैसा कि लगता है, यह नहीं किया जा सकता है, क्योंकि wp_validate_auth_cookie () हमेशा विफल रहता है, भले ही उपयोगकर्ता पर एक लॉग का कुकी-डेटा पारित हो। एक अन्य समाधान एक प्लगइन विकसित करने के लिए हो सकता है जो सत्र और उपयोगकर्ता को एक तालिका में संग्रहीत करता है, जिसे आसानी से सर्वलेट द्वारा क्वेर किया जा सकता है। या हो सकता है कि कोई दूसरा उपाय हो ...


AJAX सेवा के रूप में उपयोगकर्ता प्रमाणीकरण प्रदान करने वाले प्लगइन को क्यों न लिखें या उपयोग न करें? यह संपूर्ण WP स्टैक का उपयोग कर सकता है, और कोई भी एप्लिकेशन उपयुक्त HTTP अनुरोध जारी करके इसका उपयोग कर सकता है। हालांकि अपने उपयोगकर्ता की साख को सुरक्षित रखने के लिए सावधानी बरतें।
राफेल

मुझे लगता है कि मैंने मुझे गलत व्यक्त किया है, मुझे अजाक्स प्रमाणीकरण की आवश्यकता नहीं है। मुझे क्या ज़रूरत है एक सर्वलेट को पहले से ही प्रमाणित उपयोगकर्ता को मान्य करने की अनुमति देने का एक तरीका है। यदि उपयोगकर्ता अभी भी लॉग ऑन है, तो सत्यापित करें। मुद्दा यह है: उपयोगकर्ता लॉग इन करता है, एक अजाक्स ऐप तक पहुंचता है, जो डेटा को स्टोर / पुनर्प्राप्त करने के लिए सर्वलेट से संचार करता है। यदि उपयोगकर्ता और 2 पर लॉग से अनुरोध आता है तो सर्वलेट को 1) परीक्षण के लिए किसी तरह की आवश्यकता होती है) उपयोगकर्ताओं को आईडी (आगे डेटाबेस एक्सेस के लिए) प्राप्त करते हैं।
दावोस सीवर्थ

शायद आपको उन सभी टिप्पणियों को शामिल करने के लिए अपने प्रश्न को संपादित करना चाहिए। अधिमानतः, अपनी समस्या (!) पेश करें और आपका विचार क्या है। विशेष रूप से, आप जिस प्रक्रिया की कल्पना करते हैं, उसके चरण विवरण के द्वारा स्पष्ट चरण दें।
राफेल

मुझे उम्मीद है कि अब सवाल अधिक स्पष्ट है।
दावोस सीवर्थ

आपने इसे कैसे किया? क्या आप अपना समाधान साझा कर सकते हैं? क्या आपने XMLRPC का उपयोग किया था?
pkyeck

जवाबों:


7

वर्डप्रेस में पहले से ही एक XMLRPC सर्वर के माध्यम से बनाया गया एक एपीआई है। मतलब, आप अपने जावा ऐप से XMLRPC अनुरोध कर सकते हैं और उपयोगकर्ता नाम / पासवर्ड सत्यापित कर सकते हैं। दुर्भाग्य से, इसके माध्यम से सिर्फ प्रमाणित करने का कोई तरीका नहीं है।

उस ने कहा, अपना रोल करना बहुत आसान है। बस xmlrpc_methodsएक फिल्टर में हुक , और तुम्हारा जोड़ें। आपके द्वारा अपने ऐप से कॉल की जाने वाली xmlrpc विधि के साथ आपके द्वारा जोड़ी गई सरणी कुंजी, और मूल्य वह फ़ंक्शन होगा जो वर्डप्रेस 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उसे एक तर्क पास किया जाएगा, एक्सएमआरपीसी सर्वर को भेजी गई चीजों की सरणी।

<?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 क्लाइंट (मुझे यकीन है कि जावा एक है) के साथ अनुरोध करने में सक्षम होना चाहिए।

यहाँ मैं ऊपर (Python XMLRPC ग्राहक) का परीक्षण करने के लिए उपयोग किया गया कोड है।

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

1
धन्यवाद! यह मुझे एक बड़ा कदम आगे लाता है! क्या उपयोगकर्ताओं को कुकी का उपयोग करके इसे प्राप्त किया जा सकता है? इसलिए मुझे तार पर उपयोगकर्ता नाम / pwd स्टोर करने और भेजने की आवश्यकता नहीं है? मेरी परियोजना में अजाक्स ऐप शामिल है जो एक वर्डप्रेस पेज में एम्बेडेड है। अजाक्स ऐप एक सर्वलेट को कॉल करता है और सर्वलेट वर्डप्रेस पूछता है कि क्या उपयोगकर्ता प्रमाणित है। मैं ajax ऐप में उपयोगकर्ता / pwd को पास कर सकता हूं और इसे सर्वलेट में स्थानांतरित कर सकता हूं, लेकिन मुझे डर है कि यह बहुत सुरक्षित नहीं होगा। इसलिए मैंने wp_validate_auth_cookie () के लिए सामान्य कुकी की सामग्री को पास करने की कोशिश की, लेकिन यह हमेशा विफल रहता है।
दावोस सीवर्थ

मैं केवल एक टोकन या उपयोगकर्ता के लिए कुछ उत्पन्न करूँगा और इसे सिस्टम के दोनों सिरों पर संग्रहीत करूँगा। फिर टोकन को आगे और पीछे से पास करें।
क्रिसगुइटारगुई

2

Wordpress (वर्तमान में) की जाँच करता है कि क्या उपयोगकर्ता अभी भी एक कुकी पर लॉग इन करके जाँच कर रहा है जो लॉगिन पर देता है। यह कुछ हैशिंग करके इस कुकी की सामग्री का निर्माण करता है। विवरण "wp_generate_auth_cookie" फ़ंक्शन /wp-includes/pluggable.php में हैं:

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

आप एक ही जाँच करने के लिए अपने जावा कोड में इस एल्गोरिथ्म का उपयोग कर सकते हैं (यह और अन्य Cort_cookie फ़ंक्शन का उपयोग करके)। जेएस का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि कुकी आपके सर्वलेट को भेजे।

अन्यथा XMLRPC एक अच्छा विचार हो सकता है। आप एक नया तरीका लिख ​​सकते हैं (जैसा कि यहां एक अन्य समाधान में बताया गया है) सामान्य कुकी को मान्य करने के लिए (उपयोगकर्ता नाम और पासवर्ड को मान्य करने के बजाय आमतौर पर किया जाता है)।


2

Exec-PHP प्लगइन प्राप्त करें , और फिर एक अच्छा पर्मलिंक ( http://mysite/user_id/) और get_current_user_id()एपीआई संदर्भ पर कोड के साथ एक वर्डप्रेस पेज (पोस्ट नहीं) बनाएं :

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

तब आप उन कुकीज़ को निकाल सकते हैं जिन्हें ग्राहक आपको भेजता है और उनके GETलिए अनुरोध करता है http://127.0.0.1/user_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
}

?>

उत्तर के लिए धन्यवाद, समस्या यह है, जावा में सर्वलेट्स लिखे गए हैं, इसलिए php कोड निष्पादित नहीं किया जा सकता है। जो मैं देख रहा हूं वह कुछ प्रकार का बाहरी इंटरफ़ेस है जो वर्डप्रेस / php के साथ एक सर्वलेट / जावा को संवाद करने की अनुमति देता है। निश्चित रूप से कुछ प्रकार का इंटरफ़ेस उपलब्ध है, मैं इसे खोजने में असमर्थ हूं ...
दावोस सीवर्थ

ओह समझा। शायद Quercus caucho.com/resin-3.0/quercus जैसी किसी चीज़ का उपयोग करने से आपको दोनों दुनिया के सर्वश्रेष्ठ मिल सकते हैं?
चमकती

धन्यवाद, लेकिन quercus गलत समाधान है, क्योंकि मेरे पास पहले से ही एक काम करने वाला वर्डप्रेस / php / apache और एक काम करने वाला सर्वलेट / java / tomcat इंस्टालेशन है। अब मुझे केवल एक चीज की आवश्यकता है जो उन दो के बीच एक इंटरफ़ेस है, जो सर्वलेट को यह सत्यापित करने देता है कि क्या उपयोगकर्ता वर्डप्रेस (कुछ इंटरफ़ेस / प्रोटोकॉल / आईपीसी / जो भी हो) में लॉग इन है।
दावोस सीवर्थ

1

यह एक फाइल वर्डप्रेस प्लगइन है जो काम करता है:

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

यह मूल रूप से एक नई XML-RPC विधि को उजागर करता है जिसके साथ आप वर्डप्रेस को wordpress_logged_in_...कुकी को मान्य करने के लिए कह सकते हैं ।

फिर आपको इस विधि को क्वेरी करने और इसे wordpress_logged_in_...कुकी के मान को पास करने के लिए कुछ कोड लिखने की आवश्यकता है ।

यह विधि या तो वापस आ जाएगी false(यदि कुकी मान्य नहीं है) या उपयोगकर्ता आईडी यदि सत्यापन सफल होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.