WP REST APIはGETエンドポイントにパスワードを要求する


8

cardWP REST APIを介して公開しているカスタム投稿タイプがあります。CookieまたはBasic Authヘッダーで認証を要求する方法はありますか?パスワードのPOSTメソッドブロックの下に引数がありますが、その使用方法がわかりません。

ここに画像の説明を入力してください

回答:


9

で休憩ルートを登録すると、必要な種類の権限を持つパラメーターをregister_rest_route()使用できますpermission_callback

たとえば、アクセス許可のコールバックの実装方法WP_REST_Posts_Controller::register_routes()を確認してくださいWP_REST_Users_Controller::register_routes()

あなたが参照しているパスワード引数はコンテンツのパスワードであり、各投稿に設定でき、それは同じではありません。

しかし、次のように既存のルートをターゲットにしたいので:

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

たとえば、rest_dispatch_requestフィルターを試して、これらの種類のルートに対する追加のアクセス許可チェックをセットアップできます。

ここにデモプラグインがあります:

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 );

ここで、ルート/wp/v2/cards/wp/v2/cards/*GETし、追加のユーザー権限チェックを行います。

WordPressのCookie認証でデバッグする場合、たとえば次のように直接テストできます。

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

nonceパーツがどこから生成されたか wp_create_nonce( 'wp_rest' );

お役に立てれば!


特定のターゲットベースに対して一般的にしようとしましたが、これを回避する簡単な方法があるのでしょうか。機能の例をインラインコメントとして追加しました@MarkKaplun
バージリー

おそらく、特定の投稿タイプにregister_post_type_args設定さ$args['show_in_rest'] = is_user_logged_in();れた、またはに基づいて設定されたフィルターを使用して、特定のカスタム投稿タイプのエンドポイントを削除する方が簡単$args['rest_base']です。それが望まれるか、推奨されるかどうかは
わかり

3

表示されている「password」フィールドは、実際にはREST API用ではなく、Postエントリ自体用です。WordPressの個々の投稿はパスワードで保護されているので、コンテンツを表示するにはパスワードが必要です。

この形式の個別のポストパスワードは、強力なパスワードメカニズムではなく、共有パスワードです。パスワードはすべてのユーザーで同じであり、暗号化もハッシュ化もされずにデータベースに保存されます。これは決して安全なメカニズムとして意図されたものではなく、コンテンツを簡単な方法で隠すシンプルなメカニズムです。

このメカニズムをREST APIで使用したい場合は、それが可能です。たとえば、個々の投稿のIDが123の場合、投稿は次のように取得できます。

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

その投稿がパスワードで保護されている場合、このURLはそれを取得します。

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

リファレンス:https : //developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post

より強力なユーザーベースの認証が必要な場合、WordPressは代わりに投稿を「非公開」にする方法を提供します。この設定により、「read_private_posts」機能を持つユーザーアカウントのみに投稿が表示されます。これは、デフォルトで管理者および編集者の役割に制限されています。(注:非公開は投稿コンテンツを非公開にするだけで、タイトルは引き続き公開されます。)

カスタム投稿タイプを作成すると、これと同じ機能が複数のタイプにマップされます(plural_baseを使用)。したがって、投稿タイプのカードの場合、必要に応じてユーザーの役割に割り当てるために使用できる同様の「read_private_cards」権限があります。

現在、ユーザーレベルの認証は実際にはREST APIに組み込まれていません。標準のWordPress Cookieベースの認証は正常に機能しますが、APIはそのCookieを取得する方法を提供していません。存在する場合は受け入れますが、このようなCookieを取得するには通常のログインフローを実行する必要があります。他の認証方法が必要な場合は、そのためのプラグインが必要です。

このようなプラグインは4つあります。これらは、OAuth 1.0、アプリケーションパスワード、JSON Webトークン、および基本認証プラグインです。基本認証が最も簡単ですが、これも安全ではないため、テストと開発の目的でのみ推奨されることに注意してください。稼働中の本番サーバーでは使用しないでください。

これらのプラグインの詳細については、次をご覧ください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.