ouside wordpress / php에서 사용자를 확인하는 방법은 무엇입니까?


9

워드 프레스 페이지에 포함될 ajax 애플리케이션을 개발 중입니다. ajax 앱은 Tomcat에서 실행되는 서블릿과 데이터를 교환합니다. 이제 서블릿은 워드 프레스에 로그인 한 사용자의 요청이 있는지 확인하는 방법이 필요합니다. 그리고 사용자가 로그인 한 경우, 서블릿은 데이터베이스를 조회 할 수 있도록 사용자 ID를 판별 할 수 있어야합니다. 사용자가 로그인하지 않으면 요청이 거부됩니다.

즉, 요청을 한 사용자가 워드 프레스 (버전 3.3.x)에 로그인 한 경우에만 서블릿이 요청을 수행하도록해야합니다. 서블릿 (tomcat)과 wordpress (apache2)는 모두 동일한 물리적 시스템에서 실행되며 동일한 데이터베이스를 공유합니다.

이론적으로 이것은 다음을 수행하여 쉽게 해결할 수 있습니다.

  1. 워드 프레스 로그온 중에 일부 사용자 토큰은 자바 스크립트 변수에 저장됩니다.
  2. Ajax 앱은 모든 호출에서 사용자 토큰을 서블릿에 전달합니다.
  3. 서블릿은 토큰이 유효한 경우 (즉, 사용자가 로그인 한 경우) 토큰을 사용하여 요청을 수행하거나 거부합니다.

문제는 이것이 워드 프레스 측에서 어떻게 구현 될 수 있습니까?
이론을 그렇게 복잡하게 만드는 것은 아직 PHP 프로그래밍을하지 않았다는 사실입니다.

먼저 wordpress_logged_in (auth) 쿠키를 서블릿에 전송하고 auth 쿠키가 여전히 유효한 경우 서블릿이 wordpress를 쿼리하도록 생각했습니다. 그러나 로그온 한 사용자의 쿠키 데이터가 전달 되더라도 wp_validate_auth_cookie ()는 항상 실패하므로이 작업을 수행 할 수 없습니다. 다른 해결책은 sessionid와 userid를 테이블에 저장하는 플러그인을 개발하는 것인데, 서블릿에서 쉽게 쿼리 할 수 ​​있습니다. 아니면 다른 해결책이있을 수 있습니다 ...


AJAX 서비스로 사용자 인증을 제공하는 플러그인을 작성하거나 사용 하지 않는 이유는 무엇 입니까? 전체 WP 스택을 사용할 수 있으며 모든 응용 프로그램은 적절한 HTTP 요청을 발행하여 사용할 수 있습니다. 그러나 사용자의 자격 증명을 적절히 보호하십시오.
— Raphael

나는 내가 잘못 표현했다고 생각한다. 아약스 인증 serice가 필요하지 않다. 내가 필요한 것은 서블릿이 이미 인증 된 사용자의 유효성을 검사 할 수있는 방법입니다. 즉, 사용자가 여전히 로그온되어 있는지 확인하십시오. 요점은 다음과 같습니다. 사용자가 로그인하고 데이터를 저장 / 검색하기 위해 서블릿과 통신하는 ajax 앱에 액세스합니다. 이제 서블릿은 1) 요청이 로그온 한 사용자로부터 온 것인지 테스트하고 2) 추가 데이터베이스 액세스를 위해 사용자 ID를 검색하는 방법이 필요합니다.
— Davos Seaworth

모든 주석을 포함하도록 질문을 편집해야 할 수도 있습니다. 바람직하게는 문제 (!)와 아이디어가 무엇인지 제시하십시오. 특히, 계획 한 프로세스를 단계별로 명확하게 설명하십시오.
— Raphael

질문이 더 명확 해지기를 바랍니다.
— 다 보스시 워스

어떻게 했어? 솔루션을 공유 할 수 있습니까? XMLRPC를 사용 했습니까?
— pkyeck

답변:


7

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

1
감사합니다! 이것은 나에게 더 큰 단계를 가져옵니다! 사용자 인증 쿠키를 사용하여 동일한 결과를 얻을 수 있습니까? 그래서 유선으로 사용자 이름 / 암호를 저장하고 보낼 필요가 없습니까? 내 프로젝트는 워드 프레스 페이지에 포함 된 ajax 앱으로 구성됩니다. Ajax 앱은 서블릿을 호출하고 서블릿은 사용자가 인증되었는지 워드 프레스를 요청합니다. 사용자 / 암호를 ajax 앱으로 전달하여 서블릿으로 전송할 수는 있지만 그다지 안전하지는 않습니다. 그래서 인증 쿠키의 내용을 wp_validate_auth_cookie ()에 전달하려고 시도했지만 항상 실패합니다.
— 다 보스시 워스

사용자를 위해 토큰이나 무언가를 생성하여 시스템의 양쪽 끝에 저장합니다. 그런 다음 토큰을 앞뒤로 전달하십시오.
— chrisguitarguy

2

Wordpress (현재)는 로그인시 제공하는 쿠키 중 하나를 확인하여 사용자가 여전히 로그인되어 있는지 확인합니다. 해싱을 수행하여이 쿠키의 내용을 구성합니다. 자세한 내용은 /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는 쿠키가 서블릿으로 전송되도록하는 데 사용될 수 있습니다.

그렇지 않으면 XMLRPC가 좋습니다. 사용자 이름과 비밀번호를 확인하는 대신 인증 쿠키를 확인하는 새로운 방법 (여기 다른 솔루션에서 설명)을 작성할 수 있습니다.


2

가져 오기 Exec을-PHP 플러그인을 하고 멋진 영구 링크 (와 워드 프레스 페이지 (안 게시물) 만들기 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/. 그런 다음 사용자가 로그인했는지 여부와 사용자 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
}

?>

답장을 보내 주셔서 감사합니다. 문제는 서블릿이 Java로 작성되어 PHP 코드를 실행할 수 없다는 것입니다. 내가 찾고있는 것은 서블릿 / Java가 wordpress / php와 통신 할 수있게 해주는 일종의 외부 인터페이스입니다. 확실히 어떤 종류의 인터페이스를 사용할 수 있습니다, 나는 그것을 찾을 수 없습니다 ...
— Davos Seaworth

아, 알겠습니다 아마도 Quercus caucho.com/resin-3.0/quercus 와 같은 것을 사용 하면 두 세계의 최고를 얻을 수 있습니까?
— 깜박이

고맙지 만 quercus는 이미 작동중인 wordpress / php / apache와 작동하는 servlet / java / tomcat 설치가 있기 때문에 잘못된 솔루션입니다. 이제 내가 필요한 유일한 것은 그 둘 사이의 인터페이스입니다. 서블릿은 사용자가 워드 프레스에 로그인했는지 여부를 확인할 수 있습니다 (일부 인터페이스 / 프로토 콜 / IPC / 기타).
— 다 보스시 워스

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에 유효성 검사를 요청할 수있는 새로운 XML-RPC 방법을 제공합니다. wordpress_logged_in_... 쿠키의 .

그런 다음이 메소드를 쿼리하고 wordpress_logged_in_...쿠키 값을 전달하는 코드를 작성해야합니다 .

이 메소드는 false쿠키가 유효하지 않은 경우 또는 유효성 검사에 성공한 경우 사용자 ID를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.