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_in
REST API 외부에서와 동일하게 동작합니다.
이 문제를 해결하는 간단한 방법은permission_callback
체크하는 파라미터user logged in status
GET request URL 파라미터를 사용하여 요청 핸들러 함수로 이동합니다.추가할 수 있습니다.logged in user ID
또는temporary generated nonce / hash
URL 에서, 서버측에서 같은지 아닌지를 확인합니다.다음은 예를 제시하겠습니다.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
'programing' 카테고리의 다른 글
mongodb 로컬 서버를 시작할 수 없습니다. (0) | 2023.03.18 |
---|---|
ngModel의 $render는 언제 AngularJS에서 호출됩니까? (0) | 2023.03.18 |
woocommerce에서 제공하는 rest api를 통해 카트에 제품을 삽입하는 방법은 무엇입니까? (0) | 2023.03.18 |
WordPress 테마 편집기가 없습니다. (0) | 2023.03.18 |
ORA-12170: TNS: Connect 타임아웃 발생 (0) | 2023.03.18 |