วิธีการตรวจสอบผู้ใช้จาก ouside wordpress / php


9

ฉันกำลังทำงานกับแอปพลิเคชัน ajax ที่จะถูกฝังอยู่ในหน้าเวิร์ดเพรส แอป Ajax แลกเปลี่ยนข้อมูลกับ servlets ที่ทำงานบน Tomcat ตอนนี้เซิร์ฟเล็ตต้องการวิธีในการพิจารณาว่าคำขอมาจากผู้ใช้ที่ล็อกอินเข้าสู่ wordpress หรือไม่ และถ้าผู้ใช้ล็อกอิน, servlets จะต้องสามารถกำหนด id ผู้ใช้เพื่อให้สามารถสืบค้นฐานข้อมูลได้ หากผู้ใช้ไม่ได้เข้าสู่ระบบคำขอจะถูกปฏิเสธ

ดังนั้นในคำอื่น ๆ ฉันต้องให้ servlet ดำเนินการตามคำขอเฉพาะเมื่อผู้ใช้ที่ทำให้เกิดการร้องขอนั้นถูกล็อกอินเข้าสู่ wordpress (เวอร์ชั่น 3.3.x) ทั้ง servlet (tomcat) และ wordpress (apache2) ทำงานบนเครื่องฟิสิคัลเดียวกันและแชร์ฐานข้อมูลเดียวกัน

ในทางทฤษฎีสิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยทำสิ่งต่อไปนี้:

  1. ในระหว่างการเข้าสู่ระบบ wordpress โทเค็นของผู้ใช้บางคนจะถูกเก็บไว้ในตัวแปรจาวาสคริปต์
  2. แอป ajax ส่งต่อโทเค็นของผู้ใช้ไปยังเซิร์ฟเล็ตในทุกการโทร
  3. servlets ใช้โทเค็นเพื่อเคียวรี wordpress ถ้ามันถูกต้อง (เช่นถ้าผู้ใช้เข้าสู่ระบบ) และดำเนินการหรือปฏิเสธคำขอ

คำถามคือวิธีนี้สามารถนำมาใช้ในด้าน WordPress?
เพราะสิ่งที่ทำให้ทฤษฎีมีความซับซ้อนมากคือความจริงที่ว่าฉันยังไม่ได้เขียนโปรแกรม php

ก่อนอื่นฉันคิดว่าจะส่งคุกกี้ wordpress_logged_in (auth) ไปยัง servlet และให้ servlet query wordpress ถ้าคุกกี้ auth ยังคงใช้ได้ แต่ดูเหมือนว่าไม่สามารถทำได้เนื่องจาก wp_validate_auth_cookie () ล้มเหลวเสมอแม้ว่าจะมีการส่งผ่านข้อมูลคุกกี้ของผู้ใช้ที่เข้าสู่ระบบ โซลูชันอื่นอาจพัฒนาปลั๊กอินที่เก็บ sessionid และ userid ไว้ในตารางซึ่งสามารถสอบถามได้ง่ายโดยเซิร์ฟเล็ต หรืออาจจะมีวิธีอื่น ๆ ...


ทำไมไม่เขียนหรือใช้ปลั๊กอินที่เสนอการตรวจสอบผู้ใช้เป็นบริการ AJAX? มันสามารถใช้สแต็ก WP ทั้งหมดและแอปพลิเคชันใด ๆ สามารถใช้งานได้โดยการออกคำขอ HTTP ที่เหมาะสม อย่างไรก็ตามเพื่อปกป้องข้อมูลประจำตัวของผู้ใช้อย่างเหมาะสม
Raphael

ฉันคิดว่าฉันแสดงความผิดฉันไม่ต้องการชุดตรวจสอบสิทธิ์ ajax สิ่งที่ฉันต้องการคือวิธีที่อนุญาตให้เซิร์ฟเล็ตตรวจสอบผู้ใช้ที่ผ่านการตรวจสอบแล้ว คือตรวจสอบว่าผู้ใช้ยังคงเข้าสู่ระบบ ประเด็นคือ: ผู้ใช้ล็อกอินเข้าถึงแอป ajax ซึ่งสื่อสารกับเซิร์ฟเล็ตเพื่อจัดเก็บ / ดึงข้อมูล ตอนนี้ servlet ต้องการวิธีการ 1) ทดสอบว่าคำขอมาจากผู้ใช้ที่เข้าสู่ระบบและ 2) ดึง id ผู้ใช้ (สำหรับการเข้าถึงฐานข้อมูลเพิ่มเติม)
Davos Seaworth

บางทีคุณควรแก้ไขคำถามเพื่อรวมความคิดเห็นเหล่านั้นทั้งหมด นำเสนอปัญหาของคุณ (!) และความคิดของคุณคืออะไร โดยเฉพาะอย่างยิ่งให้อธิบายอย่างละเอียดทีละขั้นตอนของกระบวนการที่คุณคาดคิด
Raphael

ฉันหวังว่าคำถามจะชัดเจนยิ่งขึ้นในตอนนี้
Davos Seaworth

คุณจะลงเอยอย่างไร คุณแชร์โซลูชันของคุณได้ไหม คุณใช้ XMLRPC หรือไม่
pkyeck

คำตอบ:


7

WordPress มี API ในตัวผ่านเซิร์ฟเวอร์ XMLRPC แล้ว หมายความว่าคุณสามารถสร้างคำขอ XMLRPC จากแอป java ของคุณและยืนยันชื่อผู้ใช้ / รหัสผ่าน น่าเสียดายที่ไม่มีวิธีการรับรองความถูกต้องตามที่เป็นอยู่

ที่กล่าวว่ามันง่ายมากที่จะม้วนของคุณเอง เพียงแค่ขอ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จะได้รับหนึ่งอาร์กิวเมนต์ที่ผ่านไปอาเรย์ของสิ่งต่าง ๆ ที่ส่งไปยังเซิร์ฟเวอร์ 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;
}

นี่คือสิ่งที่เป็นปลั๊กอิน เมื่อติดตั้งแล้วและเปิดใช้งาน XMLRPC บนไซต์ WP ของคุณคุณควรจะสามารถร้องขอกับไคลเอนต์ XMLRPC บางตัว (ฉันแน่ใจว่า Java มี)

นี่คือรหัสที่ฉันใช้ในการทดสอบด้านบน (ไคลเอนต์ Python XMLRPC)

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

1
ขอบคุณ! นี่ทำให้ฉันก้าวหน้าไปอีกขั้น! สามารถทำได้โดยใช้คุกกี้รับรองความถูกต้องของผู้ใช้? ดังนั้นฉันไม่ต้องเก็บและส่งชื่อผู้ใช้ / รหัสผ่านสาย? โครงการของฉันประกอบด้วยแอป Ajax ที่ฝังอยู่ในหน้าเวิร์ดเพรส แอป ajax เรียก servlet และ servlet ถาม wordpress ว่าผู้ใช้รับรองความถูกต้อง ฉันสามารถส่งผู้ใช้ / รหัสผ่านไปยังแอป Ajax และโอนไปยัง servlet แต่ฉันกลัวว่าจะไม่ปลอดภัยมาก ดังนั้นฉันจึงพยายามส่งเนื้อหาของคุกกี้รับรองความถูกต้องไปที่ wp_validate_auth_cookie () แต่มันล้มเหลวเสมอ
Davos Seaworth

ฉันจะสร้างโทเค็นหรืออะไรก็ได้สำหรับผู้ใช้และเก็บไว้ที่ปลายทั้งสองของระบบ จากนั้นส่งโทเค็นกลับไปกลับมา
chrisguitarguy

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

คุณสามารถสร้างอัลกอริทึมนี้ใหม่ (ใช้ฟังก์ชันนี้และฟังก์ชั่น auth_cookie อื่น ๆ ) ในโค้ด Java ของคุณเพื่อทำการตรวจสอบแบบเดียวกัน JS สามารถใช้เพื่อให้แน่ใจว่าคุกกี้จะถูกส่งไปยังเซิร์ฟเล็ตของคุณ

มิฉะนั้น XMLRPC อาจเป็นความคิดที่ดี คุณสามารถเขียนวิธีการใหม่ (ตามที่อธิบายไว้ในวิธีแก้ไขปัญหาอื่นที่นี่) เพื่อตรวจสอบคุกกี้รับรองความถูกต้อง (แทนการตรวจสอบชื่อผู้ใช้และรหัสผ่านเช่นมักจะทำ)


2

รับปลั๊กอิน Exec-PHPจากนั้นสร้างหน้า WordPress (ไม่ใช่โพสต์) ด้วยลิงก์ถาวรที่ดี ( http://mysite/user_id/) และรหัสในการget_current_user_id()อ้างอิง API :

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

คุณสามารถทำสิ่งนี้ในหน้า non-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
}

?>

ขอบคุณสำหรับการตอบกลับปัญหาคือ servlets ถูกเขียนด้วยภาษาจาวาดังนั้นจึงไม่สามารถเรียกใช้โค้ด php ได้ สิ่งที่ฉันกำลังมองหาคืออินเตอร์เฟสภายนอกบางชนิดที่อนุญาตให้เซิร์ฟเล็ต / java สื่อสารกับ wordpress / php มีแน่นอนชนิดอินเตอร์เฟซที่มีอยู่บางส่วนฉันแค่ไม่สามารถหามัน ...
Davos Seaworth

อ่าฉันเข้าใจแล้ว บางทีการใช้บางอย่างเช่น Quercus caucho.com/resin-3.0/quercusอาจทำให้คุณได้รับสิ่งที่ดีที่สุดทั้งสองโลก?
FlashingCursor

ขอบคุณ แต่ Quercus เป็นคำตอบที่ผิดเพราะฉันมีเวิร์ดเพรส / php / apache และการติดตั้ง servlet / java / tomcat ที่ใช้งานได้ ตอนนี้สิ่งเดียวที่ฉันต้องการก็คือส่วนต่อประสานระหว่างสองสิ่งนั่นทำให้ servlet ตรวจสอบว่าผู้ใช้ล็อกอินเข้าสู่ wordpress หรือไม่
Davos Seaworth

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

โดยทั่วไปจะเปิดเผยวิธี XML-RPC ใหม่ซึ่งคุณสามารถขอให้ WordPress ตรวจสอบwordpress_logged_in_...คุกกี้ได้

จากนั้นคุณต้องเขียนโค้ดเพื่อค้นหาวิธีการนี้และส่งผ่านค่าของwordpress_logged_in_...คุกกี้

วิธีนี้จะส่งคืนfalse(ถ้าคุกกี้ไม่ตรวจสอบ) หรือ ID ผู้ใช้หากการตรวจสอบเสร็จสมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.