জনসাধারণের দেখার থেকে ওয়ার্ডপ্রেস REST এপিআই v2 এর শেষ পয়েন্টগুলি লুকানো হচ্ছে


15

আমি আমার সাইট থেকে তথ্য জিজ্ঞাসা করতে ওয়ার্ডপ্রেস REST এপিআই v2 ব্যবহার শুরু করতে চাই । আমি লক্ষ্য করেছি যে আমি যখন সরাসরি একটি এন্ডপয়েন্ট পয়েন্ট ইউআরএল পরিদর্শন করি তখন আমি সমস্ত ডেটা প্রকাশ্যে দেখতে পারি can আমি আরও দেখেছি যে প্রচুর টিউটোরিয়াল লাইভ সাইটগুলির চেয়ে পরীক্ষার বা স্থানীয় সার্ভারের ব্যবহারের কথা উল্লেখ করে।

আমার প্রশ্নগুলি হ'ল:

  • এটি কি উত্পাদনের সাইটে ব্যবহার করা উচিত?
  • এন্ডপয়েন্টগুলি যে কারও দ্বারা দেখার অনুমতি দেওয়ার কোনও সুরক্ষা ঝুঁকি রয়েছে, যেমন /wp-json/wp/v2/users/সাইটে নিবন্ধিত সমস্ত ব্যবহারকারী দেখায়?
  • কেবলমাত্র অনুমোদিত ব্যবহারকারীদের একটি শেষ পয়েন্ট অ্যাক্সেস করার অনুমতি দেওয়া কি সম্ভব?

আমি নিশ্চিত করতে চাই যে আমি সুরক্ষা সম্পর্কিত সর্বোত্তম অনুশীলনগুলি অনুসরণ করছি, তাই কোনও পরামর্শ টি সহায়ক হবে। API ডক্স প্রমাণীকরণ উল্লেখ, কিন্তু আমি নিশ্চিত কিভাবে সরাসরি অ্যাক্সেস করা থেকে URL প্রতিরোধ নই। খুব বেশি তথ্য প্রকাশ না করে অন্যরা কীভাবে এই ডেটাটি বহিরাগত অ্যাপ্লিকেশনগুলি অ্যাক্সেস করতে সাধারণত সেট আপ করেন?


1
আসল প্রশ্নটি হ'ল আপনি কি শেষপয়েন্টের ক্লায়েন্ট সাইডটি ব্যবহার করছেন (যেমন এজেএক্স কলগুলিতে), বা সার্ভার সাইড (সম্ভবত অন্য কোনও অ্যাপ্লিকেশন থেকে)?
TheDeadMedic

1
দ্রষ্টব্য: ওয়ার্ডফেন্স প্লাগইনের সবচেয়ে সাম্প্রতিক সংস্করণটিতে "'/? লেখক = এন' স্ক্যানগুলির মাধ্যমে ব্যবহারকারীর নাম আবিষ্কার, ওম্বেড এপিআই, এবং ওয়ার্ডপ্রেস রিস্ট এপিআই"
স্কয়ারকাণ্ডি

উত্তর:


18

এটি কি উত্পাদনের সাইটে ব্যবহার করা উচিত?

হ্যাঁ. অনেক সাইট ইতিমধ্যে এটি ব্যবহার করে আসছে

এন্ডপয়েন্টগুলিকে / wp-json / wp / v2 / ব্যবহারকারীদের / যেমন সাইটটিতে নিবন্ধিত সমস্ত ব্যবহারকারীর দেখায় এমন কোনও ব্যক্তির দ্বারা দেখার জন্য কোনও সুরক্ষা ঝুঁকি রয়েছে?

না। সার্ভারের প্রতিক্রিয়াগুলির সুরক্ষার সাথে কোনও সম্পর্ক নেই, আপনি খালি স্ক্রিন / পঠনযোগ্য অ্যাক্সেস দিয়ে কী করতে পারেন? কোনো কিছুই নেই!

তবে, যদি আপনার সাইটগুলি দুর্বল পাসওয়ার্ডগুলির অনুমতি দেয় তবে কিছু সমস্যা রয়েছে । তবে এটি আপনার সাইটের নীতি, REST এপিআই সে সম্পর্কে কিছুই জানে না।

কেবলমাত্র অনুমোদিত ব্যবহারকারীদের একটি শেষ পয়েন্ট অ্যাক্সেস করার অনুমতি দেওয়া কি সম্ভব?

হ্যাঁ. আপনি অনুমতি কলব্যাক ব্যবহার করে এটি করতে পারেন ।

উদাহরণ স্বরূপ:

if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) {
    return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you cannot view this resource with edit context.' ), array( 'status' => rest_authorization_required_code() ) );
}

খুব বেশি তথ্য প্রকাশ না করে অন্যরা কীভাবে এই ডেটাটি বহিরাগত অ্যাপ্লিকেশনগুলি অ্যাক্সেস করতে সাধারণত সেট আপ করেন?

এই প্রশ্নের উত্তর দেওয়া শক্ত কারণ আমরা / কখন খুব বেশি তথ্য জানি না । তবে আমরা সবাই রেফারেন্স এবং চিটশিট ব্যবহার করছি ।


1
গুরুত্বপূর্ণ লক্ষণীয়: "এক্সপোজারটি এমন ব্যবহারকারীদের মধ্যে সীমাবদ্ধ হয়ে যায় যাদের লেখার পোস্ট টাইপ রয়েছে যা REST এপিআই এর মাধ্যমে প্রকাশের জন্য সেট করা আছে।" - সুতরাং যদি আপনি বলে থাকেন যে একটি অনলাইন স্টোর যেখানে প্রতিটি গ্রাহকের ব্যবহারকারী থাকে, এই ব্যবহারকারীদের মাধ্যমে প্রকাশ করা হয় না /wp-json/wp/v2/users/। (রেফারেন্স ওয়ার্ডপ্রেস.স্ট্যাকেক্সেঞ্জারএইউ / কি / ২৫২২২৮২৪ / ৪৪৪৮৮ @ জেফফম্যান মন্তব্য)
স্কয়ারকাণ্ডি

এটা লক্ষনীয় যে আপনি 'এক্স-wp-n যখন' হেডারে বিশ্রাম ভিত্তিক আপাতত wp_create_nonce ( 'wp_rest'), বা এই কাপড় কেউই এ সব কাজ করবে থাকতে হবে, এবং সবসময় একটি 403. ফিরে আসবে
অ্যান্ড্রু Killen

5

কেবলমাত্র অনুমোদিত ব্যবহারকারীদের একটি শেষ পয়েন্ট অ্যাক্সেস করার অনুমতি দেওয়া কি সম্ভব?

আপনার এপিআই শেষ পয়েন্টে কাস্টম অনুমতি কলব্যাক যুক্ত করা সম্ভব যা সামগ্রীটি দেখার জন্য প্রমাণীকরণের প্রয়োজন। অননুমোদিত ব্যবহারকারীরা একটি ত্রুটি প্রতিক্রিয়া পাবেন"code": "rest_forbidden"

এটি করার সহজ উপায় হ'ল ডাব্লুপিপিএসএসপোস্টেস_কন্ট্রোলার প্রসারিত করা। এখানে এর একটি খুব সাধারণ উদাহরণ:

class My_Private_Posts_Controller extends WP_REST_Posts_Controller {

   /**
   * The namespace.
   *
   * @var string
   */
   protected $namespace;

   /**
   * The post type for the current object.
   *
   * @var string
   */
   protected $post_type;

   /**
   * Rest base for the current object.
   *
   * @var string
   */
   protected $rest_base;

  /**
   * Register the routes for the objects of the controller.
   * Nearly the same as WP_REST_Posts_Controller::register_routes(), but with a 
   * custom permission callback.
   */
  public function register_routes() {
    register_rest_route( $this->namespace, '/' . $this->rest_base, array(
        array(
            'methods'             => WP_REST_Server::READABLE,
            'callback'            => array( $this, 'get_items' ),
            'permission_callback' => array( $this, 'get_items_permissions_check' ),
            'args'                => $this->get_collection_params(),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::CREATABLE,
            'callback'            => array( $this, 'create_item' ),
            'permission_callback' => array( $this, 'create_item_permissions_check' ),
            'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
            'show_in_index'       => true,
        ),
        'schema' => array( $this, 'get_public_item_schema' ),
    ) );

    register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', array(
        array(
            'methods'             => WP_REST_Server::READABLE,
            'callback'            => array( $this, 'get_item' ),
            'permission_callback' => array( $this, 'get_item_permissions_check' ),
            'args'                => array(
                'context' => $this->get_context_param( array( 'default' => 'view' ) ),
            ),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::EDITABLE,
            'callback'            => array( $this, 'update_item' ),
            'permission_callback' => array( $this, 'update_item_permissions_check' ),
            'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::DELETABLE,
            'callback'            => array( $this, 'delete_item' ),
            'permission_callback' => array( $this, 'delete_item_permissions_check' ),
            'args'                => array(
                'force' => array(
                    'default'     => true,
                    'description' => __( 'Whether to bypass trash and force deletion.' ),
                ),
            ),
            'show_in_index'       => false,
        ),
        'schema' => array( $this, 'get_public_item_schema' ),
    ) );     
  }

  /**
   * Check if a given request has access to get items
   *
   * @param WP_REST_Request $request Full data about the request.
   * @return WP_Error|bool
   */
  public function get_items_permissions_check( $request ) {
    return current_user_can( 'edit_posts' );
  }

}

আপনার অনুমতি কলব্যাক বিজ্ঞপ্তি পাবেন function get_items_permissions_checkব্যবহারের current_user_canনির্ধারণ ব্যবহারের অনুমতি দেওয়া হবে কি না। আপনি কীভাবে এপিআই ব্যবহার করছেন তার উপর নির্ভর করে আপনার ক্লায়েন্ট প্রমাণীকরণ সম্পর্কে আরও শিখতে হবে।

তারপরে আপনি নীচের যুক্তিগুলি যুক্ত করে REST এপিআই সহায়তার সাথে আপনার কাস্টম পোস্ট প্রকারটি নিবন্ধভুক্ত করতে পারেন register_post_type

  /**
   * Register a book post type, with REST API support
   *
   * Based on example at: http://codex.wordpress.org/Function_Reference/register_post_type
   */
  add_action( 'init', 'my_book_cpt' );
  function my_book_cpt() {
    $labels = array(
        'name'               => _x( 'Books', 'post type general name', 'your-plugin-textdomain' ),
        'singular_name'      => _x( 'Book', 'post type singular name', 'your-plugin-textdomain' ),
        'menu_name'          => _x( 'Books', 'admin menu', 'your-plugin-textdomain' ),
        'name_admin_bar'     => _x( 'Book', 'add new on admin bar', 'your-plugin-textdomain' ),
        'add_new'            => _x( 'Add New', 'book', 'your-plugin-textdomain' ),
        'add_new_item'       => __( 'Add New Book', 'your-plugin-textdomain' ),
        'new_item'           => __( 'New Book', 'your-plugin-textdomain' ),
        'edit_item'          => __( 'Edit Book', 'your-plugin-textdomain' ),
        'view_item'          => __( 'View Book', 'your-plugin-textdomain' ),
        'all_items'          => __( 'All Books', 'your-plugin-textdomain' ),
        'search_items'       => __( 'Search Books', 'your-plugin-textdomain' ),
        'parent_item_colon'  => __( 'Parent Books:', 'your-plugin-textdomain' ),
        'not_found'          => __( 'No books found.', 'your-plugin-textdomain' ),
        'not_found_in_trash' => __( 'No books found in Trash.', 'your-plugin-textdomain' )
    );

    $args = array(
        'labels'             => $labels,
        'description'        => __( 'Description.', 'your-plugin-textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'book' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'show_in_rest'       => true,
        'rest_base'          => 'books-api',
        'rest_controller_class' => 'My_Private_Posts_Controller',
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
    );

    register_post_type( 'book', $args );
}

আপনি ডিফল্ট নিয়ামকের পরিবর্তে rest_controller_classব্যবহারগুলি দেখতে পাবেন My_Private_Posts_Controller

ডকুমেন্টেশনের বাইরে REST এপিআই ব্যবহারের জন্য ভাল উদাহরণ এবং ব্যাখ্যা খুঁজে পাওয়া আমার পক্ষে কঠিন হয়ে পড়েছে । আমি ডিফল্ট নিয়ামককে প্রসারিত করার এই দুর্দান্ত ব্যাখ্যাটি পেয়েছি এবং এখানে শেষ পয়েন্টগুলি যুক্ত করার জন্য একটি খুব গভীর গাইড রয়েছে


2

আমি লগ-ইন না হওয়া সমস্ত ব্যবহারকারীকে REST এপিআই ব্যবহার করা থেকে বিরত করতে এখানে যা ব্যবহার করেছি:

add_filter( 'rest_api_init', 'rest_only_for_authorized_users', 99 );
function rest_only_for_authorized_users($wp_rest_server){
    if ( !is_user_logged_in() ) {
        wp_die('sorry you are not allowed to access this data','cheatin eh?',403);
    }
}

বাকি শেষ পয়েন্টটির ব্যবহার যেমন প্রসারিত হতে চলেছে, এই ধরণের কৌশল সমস্যাযুক্ত হয়ে উঠবে। শেষের দিকে ডাব্লুপি-জসন শেষ পয়েন্ট অ্যাডমিন-আজাক্স একটিকে প্রতিস্থাপন করবে, যার অর্থ এখানে সব ধরণের বৈধ ফ্রন্ট এন্ড অনুরোধ থাকবে। যাইহোক, বিষয়বস্তু হিসাবে ব্যাখ্যা করা যেতে পারে এমন কিছু থেকে 403 এর সাথে মরা ভাল।
মার্ক কপলুন

@ মার্কক্যাপলুন - হ্যাঁ, আপনি সে সম্পর্কে সঠিক। আমি এটি এমন কোনও সাইটের প্রসঙ্গে ব্যবহার করছি যা প্রয়োজনীয়ভাবে কোনও পাবলিক ডেটা সরবরাহ করে না এবং আমরা ব্যবহারকারী, ব্যবহারকারী মেটা, কাস্টম পোস্ট ধরণের ডেটা ইত্যাদিসহ সংরক্ষণ করে রাখি এমন ডেটা মালিকানাযুক্ত ডেটা যা সর্বজনীন দ্বারা অ্যাক্সেস করা উচিত নয় । ক্লাসিক ডাব্লুপি টেমপ্লেট কাঠামোর মধ্যে নির্দিষ্ট কিছু ডেটা ব্যক্তিগত তা নিশ্চিত করার জন্য এবং তারপরে হঠাৎ বুঝতে পারছেন যে এটি সমস্তই REST API এর মাধ্যমে সর্বজনীনভাবে অ্যাক্সেসযোগ্য to যাইহোক, 403 পরিবেশন সম্পর্কে ভাল পয়েন্ট ...
স্কয়ারকাণ্ডি

0
add_filter( 'rest_api_init', 'rest_only_for_authorized_users', 99 );
function rest_only_for_authorized_users($wp_rest_server)
{
if( !is_user_logged_in() ) 

    wp_die('sorry you are not allowed to access this data','Require Authentication',403);
} } 
function json_authenticate_handler( $user ) {

global $wp_json_basic_auth_error;

$wp_json_basic_auth_error = null;

// Don't authenticate twice
if ( ! empty( $user ) ) {
    return $user;
}

if ( !isset( $_SERVER['PHP_AUTH_USER'] ) ) {
    return $user;
}

$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];


remove_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

$user = wp_authenticate( $username, $password );

add_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

if ( is_wp_error( $user ) ) {
    $wp_json_basic_auth_error = $user;
    return null;
}

$wp_json_basic_auth_error = true;

return $user->ID;}add_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

1
আপনি কীভাবে এবং কীভাবে এটি ওপি-র প্রশ্নের উত্তর দেয় তা পাঠ্যে বিশদভাবে জানাতে পারেন?
কেরো

এটি অপের জবাব নয় এবং আমি ব্যবহারিকভাবে কীভাবে কাজ করব তা দেখানোর জন্য কেবল কোড দিয়েছি এবং আমি আপনাকে প্রোগ্রাম থেকে সহজেই বোঝার চেষ্টা করেছি যদি আপনি তা বুঝতে পারেন
ডিপেন প্যাটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.