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.