it-swarm.com.de

WP REST API Kennwort für GET Endpoint erforderlich

Ich habe einen benutzerdefinierten Beitragstyp, card, den ich über die WP REST-API verfügbar mache. Gibt es eine Möglichkeit, eine Authentifizierung mit Cookie oder Basic Auth-Header anzufordern? Ich sehe ein Argument unter dem Methodenblock POST für das Kennwort, bin mir aber nicht sicher, wie ich es verwenden soll.

 enter image description here 

8
YarGnawh

Wenn wir eine Restroute mit register_rest_route() registrieren, können wir den Parameter permission_callback mit der gewünschten Berechtigung verwenden.

Überprüfen Sie beispielsweise, wie WP_REST_Posts_Controller::register_routes() und WP_REST_Users_Controller::register_routes() den Berechtigungsrückruf implementieren.

Das Passwort-Argument, auf das Sie sich beziehen, ist das Passwort des Inhalts, das Sie für jeden Beitrag festlegen können, und das ist nicht dasselbe.

Da Sie jedoch auf vorhandene Routen abzielen möchten, wie z.

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

sie könnten z. Der rest_dispatch_request-Filter zum Einrichten Ihrer zusätzlichen Berechtigungsprüfung für diese Art von Routen.

Hier ist ein Demo-Plugin:

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

dabei richten wir uns auf die Routen /wp/v2/cards und /wp/v2/cards/* GET mit zusätzlichen Überprüfungen der Benutzerberechtigungen.

Beim Debuggen mit der WordPress-Cookie-Authentifizierung können wir z. teste es direkt mit:

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

wo der nonce Teil von wp_create_nonce( 'wp_rest' ); erzeugt worden ist

Hoffe das hilft!

8
birgire

Das angezeigte "Passwort" -Feld bezieht sich nicht auf die REST -API, sondern auf den Post-Eintrag selbst. Einzelne Beiträge in WordPress können durch ein Passwort geschützt werden, sodass Sie das Passwort benötigen, um ihren Inhalt zu sehen.

Diese Form des individuellen Post-Passworts ist kein sicherer Passwortmechanismus, sondern ein gemeinsames Passwort. Das Passwort ist für alle Benutzer gleich und wird unverschlüsselt und unverschlüsselt in der Datenbank gespeichert. Es war niemals als sicherer Mechanismus gedacht, es ist ein einfacher Mechanismus, um Inhalte auf einfache Weise zu verbergen.

Wenn Sie diesen Mechanismus mit der API REST verwenden möchten, ist dies möglich. Wenn die ID des einzelnen Beitrags beispielsweise 123 lautet, kann ein Beitrag folgendermaßen abgerufen werden:

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

Wenn dieser Beitrag kennwortgeschützt ist, wird er von dieser URL abgerufen:

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

Referenz: https://developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post

Wenn Sie eine stärkere benutzerbasierte Authentifizierung benötigen, bietet WordPress stattdessen die Möglichkeit, Beiträge "privat" zu machen. Diese Einstellung macht Posts nur für Benutzerkonten sichtbar, die über die Funktion "read_private_posts" verfügen, die standardmäßig auf die Rollen "Administrator" und "Editor" beschränkt ist. (Hinweis: Privat macht den Inhalt des Beitrags nur privat. Die Titel können weiterhin angezeigt werden.)

Wenn Sie einen benutzerdefinierten Beitragstyp erstellen, wird dieselbe Funktion dem Plural Ihres Typs zugeordnet (mithilfe von plural_base). Für einen Post-Kartentyp ist daher eine ähnliche Berechtigung "read_private_cards" verfügbar, die Sie bei Bedarf den Benutzerrollen zuweisen können.

Jetzt ist die Authentifizierung auf Benutzerebene nicht wirklich in die REST-API integriert. Die standardmäßige, auf WordPress-Cookies basierende Authentifizierung funktioniert einwandfrei, die API bietet jedoch keine Möglichkeit, diese Cookies abzurufen. Es akzeptiert es, wenn es vorhanden ist, aber Sie müssen den normalen Anmeldefluss ausführen, um ein solches Cookie zu erhalten. Wenn Sie einen anderen Authentifizierungsansatz wünschen, benötigen Sie ein Plugin dafür.

Es gibt vier solche Plugins. Dies sind OAuth 1.0, Anwendungskennwörter, JSON-Web-Token und ein Plug-in für die Basisauthentifizierung. Beachten Sie, dass die Standardauthentifizierung am einfachsten ist, jedoch auch unsicher ist und daher nur zu Test- und Entwicklungszwecken empfohlen wird. Es sollte nicht auf einem Live-Produktionsserver verwendet werden.

Weitere Informationen zu diesen Plugins finden Sie hier:

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

3
Otto