Làm thế nào để xác thực người dùng từ wordpress / php?


9

Tôi đang làm việc trên một ứng dụng ajax sẽ được nhúng vào trang wordpress. Ứng dụng ajax trao đổi dữ liệu với các servlet chạy trên tomcat. Bây giờ các servlet cần một cách để xác định xem một yêu cầu đến từ người dùng đã đăng nhập vào wordpress. Và nếu người dùng đã đăng nhập, các servlet cũng phải có khả năng xác định id người dùng để có thể truy vấn cơ sở dữ liệu. Nếu người dùng không đăng nhập nó, yêu cầu sẽ bị từ chối.

Vì vậy, nói cách khác, tôi cần để cho một servlet chỉ thực hiện một yêu cầu nếu người dùng gây ra yêu cầu được đăng nhập vào wordpress (phiên bản 3.3.x). Cả hai, servlet (tomcat) và wordpress (apache2) đều chạy trên cùng một máy vật lý và chia sẻ cùng một cơ sở dữ liệu.

Về lý thuyết, điều này có thể dễ dàng được giải quyết bằng cách làm như sau:

  1. Trong quá trình đăng nhập wordpress, một số mã thông báo người dùng được lưu trữ trong một biến javascript.
  2. Ứng dụng ajax chuyển tiếp mã thông báo người dùng đến các máy chủ trong mỗi cuộc gọi.
  3. Các servlet sử dụng mã thông báo để truy vấn wordpress nếu nó hợp lệ (nghĩa là nếu người dùng đã đăng nhập) và thực hiện hoặc từ chối yêu cầu.

Câu hỏi là làm thế nào điều này có thể được thực hiện ở phía wordpress?
Bởi vì, điều làm cho lý thuyết trở nên phức tạp là thực tế là tôi chưa thực hiện bất kỳ chương trình php nào.

Đầu tiên tôi nghĩ đến việc truyền cookie wordpress_logged_in (auth) đến servlet và để cho servlet truy vấn wordpress nếu cookie auth vẫn còn hiệu lực. Nhưng dường như, điều này không thể được thực hiện, vì wp_validate_auth_cookie () luôn thất bại, ngay cả khi dữ liệu cookie của người dùng đã đăng nhập được thông qua. Một giải pháp khác có thể là phát triển một plugin lưu trữ sessionid và userid trong một bảng, có thể dễ dàng truy vấn bởi các servlet. Hoặc có thể có một giải pháp khác ...


Tại sao không viết hoặc sử dụng plugin cung cấp xác thực người dùng dưới dạng dịch vụ AJAX? Nó có thể sử dụng toàn bộ ngăn xếp WP và bất kỳ ứng dụng nào cũng có thể sử dụng nó bằng cách đưa ra một yêu cầu HTTP phù hợp. Tuy nhiên, hãy cẩn thận để bảo vệ thông tin đăng nhập của người dùng của bạn một cách thích hợp.
Raphael

Tôi nghĩ rằng tôi đã bày tỏ sai, tôi không cần một serice xác thực ajax. Những gì tôi cần là một cách để cho phép một servlet xác thực người dùng đã được xác thực. Tức là xác minh nếu người dùng vẫn đăng nhập. Vấn đề là đây: Người dùng đăng nhập, truy cập ứng dụng ajax, giao tiếp với servlet để lưu trữ / truy xuất dữ liệu. Bây giờ servlet cần một số cách để 1) kiểm tra nếu yêu cầu đến từ người dùng đã đăng nhập và 2) truy xuất id người dùng (để truy cập cơ sở dữ liệu tiếp theo).
Davos Seaworth

Có lẽ bạn nên chỉnh sửa câu hỏi của mình để kết hợp tất cả những bình luận đó. Tốt nhất, trình bày vấn đề của bạn (!) Và ý tưởng của bạn là gì. Cụ thể, hãy đưa ra một mô tả rõ ràng từng bước về quá trình bạn hình dung.
Raphael

Tôi hy vọng câu hỏi rõ ràng hơn bây giờ.
Davos Seaworth

Làm thế nào bạn kết thúc việc đó? bạn có thể chia sẻ giải pháp của bạn? bạn đã sử dụng XMLRPC chưa?
pkyeck

Câu trả lời:


7

WordPress đã có API được tích hợp thông qua máy chủ XMLRPC. Có nghĩa là, bạn có thể tạo một yêu cầu XMLRPC từ ứng dụng java của mình và xác minh tên người dùng / mật khẩu. Thật không may, không có cách nào để xác thực thông qua nó.

Điều đó nói rằng, nó rất dễ dàng để cuộn của riêng bạn. Chỉ cần nối vào xmlrpc_methods, một bộ lọc và thêm của bạn. Khóa mảng bạn thêm bằng phương thức xmlrpc mà bạn gọi từ ứng dụng của mình và giá trị sẽ là hàm được gọi bởi máy chủ XMLRPC của WordPress.

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

Và hàm gọi lại wpse39662_check_login, sẽ nhận được một đối số được truyền cho nó, mảng các thứ được gửi đến máy chủ 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;
}

Đây là tất cả như là một plugin . Với cài đặt và XMLRPC được kích hoạt trên trang WP của bạn, bạn sẽ có thể thực hiện các yêu cầu với một số máy khách XMLRPC (tôi chắc chắn Java có một).

Đây là mã tôi đã sử dụng để kiểm tra ở trên (máy khách Python XMLRPC).

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

1
Cảm ơn bạn! Điều này mang lại cho tôi một bước tiến lớn hơn nữa! Điều tương tự có thể đạt được bằng cách sử dụng cookie auth người dùng? Vì vậy, tôi không phải lưu trữ và gửi tên người dùng / pwd qua dây? Dự án của tôi bao gồm một ứng dụng ajax được nhúng vào trang wordpress. Ứng dụng ajax gọi một servlet và servlet hỏi wordpress nếu người dùng được xác thực. Tôi có thể chuyển người dùng / pwd sang ứng dụng ajax và chuyển nó sang servlet, nhưng tôi sợ điều đó sẽ không an toàn. Vì vậy, tôi đã thử chuyển nội dung của cookie auth cho wp_validate_auth_cookie () nhưng luôn thất bại.
Davos Seaworth

Tôi sẽ chỉ tạo một mã thông báo hoặc một cái gì đó cho người dùng và lưu trữ nó trên cả hai đầu của hệ thống. Sau đó chuyển mã thông báo qua lại.
chrisguitarguy

2

Wordpress (hiện tại) kiểm tra xem người dùng có còn đăng nhập hay không bằng cách kiểm tra một trong những cookie mà nó đưa ra khi đăng nhập. Nó xây dựng nội dung của cookie này bằng cách thực hiện một số băm. Các chi tiết nằm trong hàm "wp_generate_auth_cookie" trong /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);
}

Bạn có thể tạo lại thuật toán này (sử dụng hàm này và các hàm auth_cookie khác) trong mã Java của bạn để thực hiện các kiểm tra tương tự. JS có thể được sử dụng để đảm bảo cookie được gửi đến servlet của bạn.

Mặt khác, XMLRPC có thể là một ý tưởng tốt. Bạn có thể viết một phương thức mới (như được giải thích trong một giải pháp khác tại đây) để xác thực cookie xác thực (thay vì xác thực tên người dùng và mật khẩu như thường được thực hiện).


2

Nhận plugin Exec-PHP , sau đó tạo một trang WordPress (không phải bài đăng) với permalink ( http://mysite/user_id/) đẹp và mã trên get_current_user_id()tham chiếu 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.'.';
}
?>

Sau đó, bạn có thể trích xuất các cookie mà khách hàng gửi cho bạn và đặt chúng trong một GETyêu cầu http://127.0.0.1/user_id/. Sau đó, bạn sẽ biết liệu người dùng đã đăng nhập và ID người dùng của họ là gì.


1

Bạn có thể làm một cái gì đó như thế này trên các trang không 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
}

?>

Cảm ơn đã trả lời, vấn đề là, các servlet được viết bằng java, vì vậy mã php không thể được thực thi. Những gì tôi đang tìm kiếm là một loại giao diện bên ngoài cho phép một servlet / java giao tiếp với wordpress / php. Chắc chắn có một số loại giao diện có sẵn, tôi chỉ không thể tìm thấy nó ...
Davos Seaworth

Ah tôi thấy. Có lẽ sử dụng một cái gì đó như Quercus caucho.com/resin-3.0/quercus có thể giúp bạn trở thành người giỏi nhất của cả hai thế giới?
Nhấp nháy

Cảm ơn bạn, nhưng quercus là giải pháp sai, vì tôi đã có một wordpress / php / apache đang hoạt động và cài đặt servlet / java / tomcat hoạt động. Bây giờ điều duy nhất tôi cần là một giao diện giữa hai cái đó, cho phép servlet xác minh xem người dùng có đăng nhập vào wordpress không (một số giao diện / protocoll / ipc / bất cứ thứ gì).
Davos Seaworth

1

Đây là một plugin WordPress một tệp thực hiện công việc:

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

Về cơ bản, nó trưng ra một phương thức XML-RPC mới mà bạn có thể yêu cầu WordPress xác thực wordpress_logged_in_...cookie.

Sau đó, bạn cần phải viết một số mã để truy vấn phương thức này và truyền cho nó giá trị của wordpress_logged_in_...cookie.

Phương pháp này sẽ trả về false(nếu cookie không xác thực) hoặc ID người dùng nếu xác thực thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.