programing

WordPress API Permission Callback – 사용자가 로그인하고 있는지 확인합니다.

lastmoon 2023. 3. 18. 09:16
반응형

WordPress API Permission Callback – 사용자가 로그인하고 있는지 확인합니다.

WP Rest API 작업 시 permission callback에 대한 질문이 있습니다.register_rest_route를 사용하여 몇 개의 엔드포인트를 등록했는데 로그인하지 않으면 콘텐츠에 액세스할 수 없도록 보호하려고 합니다.

add_action('rest_api_init', 'register_custom_endpoints');

function register_custom_endpoints(){
    register_rest_route($base, $endpoint, [
        'methods' => 'POST',
        'callback' => function($request){
            // Return JSON data
        },
        'permission_callback' => function($request){
            // This always returns false
            return is_user_logged_in();
        },
    ]);
}

여기 내 논리는 맞는 것 같은데is_user_logged_in()항상 false를 반환합니다.즉, 실제로 로그인해도 데이터를 얻을 수 없습니다.404의 답변만 받습니다.

{code: "rest_user_invalid_id", message: "Invalid user ID.", data: {status: 404}}

웹을 샅샅이 뒤져보니 요청서와 함께 난스를 보내야 한다는 것을 알게 되었습니다.바디 데이터로도 헤더로도 전송해 보았습니다.본문으로 보내면 항상 false가 반환되기 때문에 확인할 수 없습니다.그리고 헤더로 보내면 위와 같은 404의 답변을 받습니다.

제가 뭘 놓치고 있는 거죠? 제가 뭘 잘못하고 있는 거죠?

최근에 같은 문제가 발생했는데, 난스를 생성하여 요청 헤더와 함께 전달해야 합니다.

다음 php 코드를 사용하여 적절한 난스를 만듭니다.

$nonce = wp_create_nonce( 'wp_rest' );

그런 다음 헤더를 통해 HTTP 요구와 함께 난스를 전달합니다.X-WP-Nonce.

클라이언트가 같은 도메인에 있는 경우(WordPress의 auth cookie가 설정되어 있음) REST API를 통해 세션에 액세스할 수 있어야 합니다.이것에 의해, 다음과 같은 기능이 가능하게 됩니다.current_user_can그리고.is_user_logged_inREST API 외부에서와 동일하게 동작합니다.

이 문제를 해결하는 간단한 방법은permission_callback체크하는 파라미터user logged in statusGET request URL 파라미터를 사용하여 요청 핸들러 함수로 이동합니다.추가할 수 있습니다.logged in user ID또는temporary generated nonce / hashURL 에서, 서버측에서 같은지 아닌지를 확인합니다.다음은 예를 제시하겠습니다.domain.tld/wp-json/user/1/todo/

class UserAPI
{
    public function __construct()
    {
        // do nothing
    }

    public function setHooks()
    {
        add_action('rest_api_init', [$this, 'actionRestApiInit']);
    }

    public function actionRestApiInit()
    {
        // add current user ID into GLOBALS to get it in the request handler function
        $GLOBALS['user_id'] = get_current_user_id();

        register_rest_route(
            'user',
            '(?P<userID>\d+)/(?P<action>[a-zA-Z0-9-]+)/',
            [
                'methods' => 'GET',
                'callback' => [$this, 'runAction'],
            ]
        );
    }

    public function runAction(\WP_REST_Request $data=null)
    {
        $params = $data->get_params();

        if ((int)$params['userID']!==(int)$GLOBALS['user_id']) {
            return new \WP_Error( 'rest_forbidden', __('Sorry, you are not allowed to do that.'), ['status' => 401] );
        }

        wp_send_json(['Logged in, run api'], 200);
    }
}

(new UserAPI())->setHooks();

또는 Rest Route Attribute로서 다음과 같이 지정합니다.

register_rest_route(
    'user',
    '(?P<userID>\d+)/(?P<action>[a-zA-Z0-9-]+)/',
    [
        'methods'   => 'GET',
        'callback'  => [$this, 'userActions'],
        'user_ID'   => get_current_user_id(),
    ]
);

다음 중 하나:

if ( (int) $params['userID'] !== (int) $data->get_attributes()['user_ID'] )

사용할 수 있습니다.current_user_can( 'edit_posts' );

관리자 사용자만 사용할 수 있습니다.

자세한 것은, https://developer.wordpress.org/reference/functions/current_user_can/ 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/47455745/wordpress-api-permission-callback-check-if-user-is-logged-in

반응형