web-dev-qa-db-ja.com

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

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

enter image description here 

8
YarGnawh

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のクッキー認証でそれをデバッグするとき、私たちはできます。直接テストしてください。

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

ナンス部分がwp_create_nonce( 'wp_rest' );から生成された場所

お役に立てれば!

8
birgire

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

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

このメカニズムをREST AP​​Iと共に使用したい場合は、可能です。たとえば、個々の投稿の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 AP​​Iに組み込まれていません。標準的なWordPressのクッキーベースの認証はうまくいきますが、APIはそのクッキーを取得する方法を提供しません。存在する場合はそれを受け入れますが、そのようなcookieを取得するには通常のログインフローを実行する必要があります。他の認証方法が必要な場合は、そのためのプラグインが必要です。

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

これらのプラグインの詳細については、こちらを参照してください。

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

3
Otto