Postman 과 Wp REST API 2.0 으로 JWT 서버엔진 만들기 (1)

[vc_row][vc_column][vc_column_text]POSTMan 은 정말 괜찮은 테스트 도구 입니다.

https://www.getpostman.com/ 에서 다운 로드 받으면 되는데, Chrome 의 App 으로 나온 버전과  PC Standalone 버전이 있습니다.

Chrome 버전은 deprecate 이기 PC Standalone 버전을 쓰는 편이 좋을 것 같네요.

POSTMan 은 HEADER, GET, POST 를 자유롭게 에디팅해서 테스트로 밀어넣고 그 결과를 빠르게 확인하기 쉬운 인터페이스를 갖추고 있습니다.

API 를 제작할 때나 API 를 이용하는 앱을 개발할 때 모두 POSTMan 이 큰 도움이 됩니다.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]자, 그러면 앱이나 다른 서비스에서 API 를 호출해서 회원가입을 만드는 것을 해 보기로 하죠.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]워드프레스의 REST_API 를 활용하기 위해서는 rest_api_init 을 hook 해야 합니다.

function generate_unique_username( $username ) {
	static $i;
	if ( null === $i ) {
		$i = 1;
	} else {
		$i++;
	}
	if ( ! username_exists( $username ) ) {
		return $username;
	}
	$new_username = sprintf( '%s-%s', $username, $i );
	if ( ! username_exists( $new_username ) ) {
		return $new_username;
	} else {
		return call_user_func( __FUNCTION__, $username );
	}
}

function register_user($request){

	global $wpdb;

	$creds = array();

	$username = $request["username"];
	$email = $request["email"];
	$password =  $request["password"];
	$nickname = $request["nickname"];

	$ret = array();

 	if(strlen($password) >=6){

		$user_id = email_exists( $email );

		if( !$user_id ){

			if(!$username){
				list($username) = explode('@',$email);
			}

			$username = generate_unique_username($username);
			$s =  " wp_create_user( $username, $password, $email ); ";
			$user_id = wp_create_user( $username, $password, $email );

			if($nickname){
				wp_update_user( array( 'ID' => $user_id, 'display_name' => $nickname ) );
			}

			$ret['id'] = $user_id;

		} else {
			$ret['code'] = 'user already exist';
			$ret['data'] = array("status"=>403);
			$ret['message'] = "This User is already exist";
		}

	} else {
		$ret['code'] = 'too short password';
		$ret['data'] = array("status"=>403);
		$ret['message'] = "Password should be six more";
	}

	return $ret;

}

이제 add_action 은 특정 시점에 특정 프로그램을 실행하기 위해 필요합니다.

rest_api_init 라는 타이밍에 register_api_hooks 이라는 함수를 실행하는데, 이 함수에는 REST_API 의 permalink 를 핸들링하는 부분이 있습니다.

이 부분이 중요한 라인인데요.

보통 WordPress 를 설치하면 /wp-json/wp/v2/posts 를 하면 설치된 워드프레스의 글 , 그러니깐 post 타입으로 정의된 컨텐츠들을 뿌려주거든요.

register_rest_route 은 wp/v2 처럼 별도로 정의된 REST API 의 route 을 만들어주는 작업이 되는 것이지요.

register_rest_route  ‘msgapi/v1’, ‘/user/register/’, POST , register_user

API 의 namespace 를 매핑하는 파트가 첫 번째, 두 번째 파라미터이고요.

3번째는 REQUEST TYPE 을 정의하는 부분이고 마지막 4번 째는 callback 함수를 선언해주는 부분입니다.

이제 register_user 함수 부분을 볼까요 ?

function register_user($request){

	global $wpdb;

	$creds = array();

	$username = $request["username"];
	$email = $request["email"];
	$password =  $request["password"];
	$nickname = $request["nickname"];

	$ret = array();

 	if(strlen($password) >=6){

		$user_id = email_exists( $email );

		if( !$user_id ){

			if(!$username){
				list($username) = explode('@',$email);
			}

			$username = generate_unique_username($username);
			$s =  " wp_create_user( $username, $password, $email ); ";
			file_put_contents("/home/msgapi/public_html/log/t.log",$s);			
			$user_id = wp_create_user( $username, $password, $email );

			if($nickname){
				wp_update_user( array( 'ID' => $user_id, 'display_name' => $nickname ) );
			}

			$ret['id'] = $user_id;

		} else {
			$ret['code'] = 'user already exist';
			$ret['data'] = array("status"=>403);
			$ret['message'] = "This User is already exist";
		}

	} else {
		$ret['code'] = 'too short password';
		$ret['data'] = array("status"=>403);
		$ret['message'] = "Password should be six more";
	}

	return $ret;

}

WP_REST_API 에서는 에러 메세지 코드에 사용되는 파라미터가 code, data, message 이기 때문에, 가급적 비슷하게 만들어 보았고요.

이 부분의 코드는 username email password nickname 을 받아서 wp_users 와  wp_usermeta 에 넣는 작업입니다.

wordpress 는 미리 정의해둔 함수를 사용하여야 합니다.

왜냐하면 다른 플러그인들도 다 유기적으로 엮혀 있기 때문에 이 부분을 $wpdb->query(” insert wp_users .. “) 이런 식으로 회원등록을 할 수도 있겠지만, 그렇게 되면, 다른 플러그인들과 유기적으로 연결된 코드들이 작동하지 않게 될 것입니다.

왜냐하면, 회원 가입과 관련된 플러그인은 wp_create_user 함수 내에 do_action 부분을 add_action 으로 연결하고 있기 때문이지요.

워드프레스 개발의 핵심은 이런 구조적 연결성과 의존성을 이해하는 것입니다.

자, 그러면 POSTMan 으로 회원가입을 만들어 볼까요 ?[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]API 로 회원가입을 하는건 네임스페이스에 파라미터를 규칙에 맞추어 전송하는 작업을 하면 되는데, 이 과정은 PostMan 으로 하면 좀 더 간편합니다.

http://msgapi.wper.kr/wp-json/msgapi/v1/user/register/

POST /wp-json/msgapi/v1/user/register/ HTTP/1.1
Host: msgapi.wper.kr
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: feb98489-7432-58e1-1fa1-3c42a7dbb154

username=userid1&password=password!%40&email=userid01%40wper.kr&nicename=%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9C%A0%EC%A0%80

Postman 의 Code 부분을 보면 RAW 파일로 호출 URL 값을 확인할 수 있습니다.

이것을 Angular.js 로 구현하려면

( function() {

  var app = angular.module( 'msgAPI', [] );

  app.controller( 'MainController', function( $scope, $http ) {

    var apiHost = 'http://msgapi.wper.kr/wp-json';

    $http.post( apiHost + '/msgapi/v1/token', {
        username: 'user01',
        password: 'password!@',
        email: 'user01@wper.kr',
        nickname: '테스트유저'
      } )

      .then( function( response ) {
        console.log( response.data )
      } )

      .catch( function( error ) {
        console.error( 'Error', error.data[0] );
      } );

  } );

} )();

다음 편에는 회원 로그인과 JWT 인증, Authorization Bearer 에 관한 이야기를 할까 합니다. 기대해주세요.

[/vc_column_text][/vc_column][/vc_row]