API WP REST Yêu cầu mật khẩu cho điểm cuối GET


8

Tôi có một loại bài đăng tùy chỉnh card, mà tôi đang phơi bày thông qua API WP REST. Có cách nào để yêu cầu xác thực, với cookie hoặc tiêu đề Auth cơ bản không? Tôi thấy một đối số trong khối phương thức POST cho mật khẩu, nhưng tôi không chắc cách sử dụng nó.

nhập mô tả hình ảnh ở đây

Câu trả lời:


9

Khi chúng tôi đăng ký một tuyến đường nghỉ ngơi với register_rest_route(), sau đó chúng tôi có thể sử dụng permission_callbacktham số với loại quyền mà chúng tôi muốn.

Kiểm tra ví dụ như thế nào WP_REST_Posts_Controller::register_routes()WP_REST_Users_Controller::register_routes()thực hiện gọi lại cho phép.

Đối số mật khẩu mà bạn đề cập đến là mật khẩu của nội dung mà bạn có thể đặt cho mỗi bài đăng và điều đó không giống nhau.

Nhưng vì bạn muốn nhắm mục tiêu các tuyến hiện có, như:

/wp/v2/cards
/wp/v2/cards/(?P<id>[\d]+)
/wp/v2/cards/...possibly some other patterns...

bạn có thể thử, ví dụ: rest_dispatch_requestbộ lọc để thiết lập kiểm tra quyền bổ sung cho các loại tuyến đường đó.

Đây là một plugin demo:

add_filter( 'rest_dispatch_request', function( $dispatch_result, $request, $route, $hndlr )
{
    $target_base = '/wp/v2/cards';    // Edit to your needs

    $pattern1 = untrailingslashit( $target_base ); // e.g. /wp/v2/cards
    $pattern2 = trailingslashit( $target_base );   // e.g. /wp/v2/cards/

    // Target only /wp/v2/cards and /wp/v2/cards/*
    if( $pattern1 !== $route && $pattern2 !== substr( $route, 0, strlen( $pattern2 ) ) )
        return $dispatch_result;

    // Additional permission check
    if( is_user_logged_in() )  // or e.g. current_user_can( 'manage_options' )
        return $dispatch_result;

    // Target GET method
    if( WP_REST_Server::READABLE !== $request->get_method() ) 
        return $dispatch_result;

    return new \WP_Error( 
        'rest_forbidden', 
        esc_html__( 'Sorry, you are not allowed to do that.', 'wpse' ), 
        [ 'status' => 403 ] 
    );

}, 10, 4 );

nơi chúng tôi nhắm mục tiêu các tuyến /wp/v2/cards/wp/v2/cards/*GET, với các kiểm tra cấp phép người dùng bổ sung.

Khi gỡ lỗi bằng xác thực cookie WordPress, chúng tôi có thể kiểm tra trực tiếp bằng:

https://example.tld/wp-json/wp/v2/cards?_wpnonce=9467a0bf9c

phần nonce đã được tạo ra từ đâu wp_create_nonce( 'wp_rest' );

Hi vọng điêu nay co ich!


Tôi đã cố gắng làm cho nó chung cho một cơ sở mục tiêu nhất định, nhưng có lẽ có một cách dễ dàng hơn xung quanh vấn đề này? Tôi đã thêm một ví dụ về khả năng như một nhận xét nội tuyến @MarkKaplun
birgire

Có thể đơn giản hơn nữa là xóa điểm cuối cho loại bài đăng tùy chỉnh nhất định, với register_post_type_argsbộ lọc và e, g, được đặt $args['show_in_rest'] = is_user_logged_in();cho loại bài đăng nhất định hoặc dựa trên $args['rest_base']. Không chắc chắn nếu điều đó muốn hay được đề xuất ;-)
birgire

3

Trường "mật khẩu" bạn đang thấy thực sự không dành cho API REST, mà dành cho chính mục nhập Bài đăng. Các bài đăng cá nhân trong WordPress có thể được bảo vệ bằng mật khẩu sao cho bạn cần mật khẩu để xem nội dung của chúng.

Hình thức mật khẩu bài cá nhân này không phải là một cơ chế mật khẩu mạnh, nó là một mật khẩu được chia sẻ. Mật khẩu giống nhau cho tất cả người dùng và nó được lưu trữ trong cơ sở dữ liệu không được mã hóa và không bị xóa. Nó không bao giờ được dự định là một cơ chế bảo mật bằng bất kỳ phương tiện nào, nó là một cơ chế đơn giản để ẩn nội dung một cách đơn giản.

Nếu bạn muốn sử dụng cơ chế này với API REST, thì có thể. Ví dụ: nếu ID của bài đăng cá nhân là 123, thì bài đăng có thể được truy xuất như vậy:

http://example.com/wp-json/wp/v2/posts/123

Nếu bài đăng đó được bảo vệ bằng mật khẩu, thì URL này sẽ truy xuất nó:

http://example.com/wp-json/wp/v2/posts/123?password=example-pass

Tham khảo: https://developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post

Nếu bạn cần xác thực dựa trên người dùng mạnh mẽ hơn, thì WordPress sẽ cung cấp cách để đăng bài "riêng tư". Cài đặt này làm cho các bài đăng chỉ hiển thị đối với các tài khoản người dùng có khả năng "read_private_posts", được giới hạn ở vai trò Quản trị viên và Biên tập viên theo mặc định. (Lưu ý: Riêng tư chỉ làm cho nội dung bài đăng ở chế độ riêng tư, Tiêu đề của chúng vẫn có thể được hiển thị.)

Khi bạn tạo một loại bài đăng tùy chỉnh, khả năng tương tự này được ánh xạ tới số nhiều của loại của bạn (sử dụng số nhiều). Vì vậy, đối với loại bài đăng của thẻ, sẽ có quyền "read_private_cards" tương tự có sẵn để bạn gán cho vai trò người dùng nếu muốn.

Bây giờ, Xác thực ở cấp độ người dùng không thực sự được tích hợp vào API REST. Xác thực dựa trên cookie WordPress tiêu chuẩn hoạt động tốt, tuy nhiên API không cung cấp cách nào để có được cookie đó. Nó sẽ chấp nhận nó nếu nó có mặt, nhưng bạn phải thực hiện luồng đăng nhập bình thường để có được một cookie như vậy. Nếu bạn muốn một số phương pháp xác thực khác, thì bạn cần một plugin cho nó.

Bốn plugin như vậy tồn tại. Đó là OAuth 1.0, Mật khẩu ứng dụng, Mã thông báo web JSON và plugin Xác thực cơ bản. Lưu ý rằng Xác thực cơ bản là dễ nhất, tuy nhiên nó cũng không an toàn và do đó chỉ được khuyến nghị cho mục đích thử nghiệm và phát triển. Nó không nên được sử dụng trên một máy chủ sản xuất trực tiếp.

Bạn có thể tìm thêm thông tin về các plugin này tại đây:

https://developer.wordpress.org/rest-api/USE-the-rest-api/authentication/#authentication-plugins

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.