webentwicklung-frage-antwort-db.com.de

Wie bekomme ich einen aktuell angemeldeten Benutzer mit Wordpress Rest Api?

Ich habe versucht, eine benutzerdefinierte Anfrage hinzuzufügen.

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return wp_get_current_user();
        }
    ));
});

Es wird jedoch immer ein Benutzer mit der ID = 0 zurückgegeben. Ich habe auch folgendes versucht:

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return is_user_logged_in();
        }
    ));
});

Und es wird immer false zurückgegeben. Der Benutzer ist jedoch sicher angemeldet.

Ich habe mein benutzerdefiniertes Login hinzugefügt

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'POST',
        'callback' => function(WP_REST_Request $request) {
            $nonce = wp_create_nonce("wp_rest");
            $user = wp_signon(array('user_login' => $_POST['username'],
                'user_password' => $_POST['password'], "rememberme" => true), false);
            if (is_wp_error($user)) {
                return $user;
            }

            //do_action( 'wp_login', "capad" );
            //$user['isloggedin'] = is_user_logged_in();
            return array('user' => $user,
                'nonce' => $nonce);
        }
    ));
});

Und ich füge "X-WP-Nonce" als Header für eine http-Anfrage hinzu

Und jetzt wird jede Anforderung ausgegeben: {"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}

14

Aus dem Kapitel Authentication im REST API-Handbuch:

Die Cookie-Authentifizierung ist die grundlegende Authentifizierungsmethode, die in .__ enthalten ist. WordPress. Wenn Sie sich bei Ihrem Dashboard anmelden, werden die Cookies eingerichtet richtig für Sie, so dass Plugin- und Theme-Entwickler nur eine .__ haben müssen. angemeldeter Benutzer.

Die API REST enthält jedoch eine Technik, die als Nonces bezeichnet wird, um CSRF .__ zu vermeiden. Probleme. Dadurch wird verhindert, dass andere Sites Sie zur Ausführung von Aktionen zwingen ohne dies ausdrücklich zu beabsichtigen. Dies erfordert etwas Besonderes Handhabung für die API.

Für Entwickler, die die integrierte Javascript-API verwenden, wird dies behandelt automatisch für Sie. Dies ist die empfohlene Methode zur Verwendung der API für Plugins und Themes. Benutzerdefinierte Datenmodelle können wp.api.models.Base .__ erweitern. um sicherzustellen, dass dies für benutzerdefinierte Anforderungen korrekt gesendet wird.

Für Entwickler, die manuelle Ajax-Anforderungen erstellen, muss die Nonce .__ sein. mit jeder Anfrage bestanden. Die API verwendet Nonces, wobei die Aktion auf .__ festgelegt ist. wp_rest. Diese können dann über die _wpnonce-Daten an die API übergeben werden Parameter (entweder POST - Daten oder in der Abfrage für GET-Anforderungen) oder über der X-WP-Nonce-Header.

Hier ist ein GET-Beispiel:

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

oder in deinem Fall:

https://example.tld/wp-json/custom/login/?_wpnonce=9463a0bf9c

woher die Nonce entsteht 

wp_create_nonce( 'wp_rest' );

Am wahrscheinlichsten haben Sie den nonce-Teil beim Testen Ihres benutzerdefinierten Endpunkts vergessen.

Ich hoffe es hilft!

17
birgire

Wenn Sie die JWT-Authentifizierung für WP REST API bevorzugen, ist die Implementierung mit Json Web Token möglicherweise einfacher.

Zuerst authentifizieren Sie den Client, der eine HTTP POST Anforderung an die Endpoint-Felder / wp-json/jwt-auth/v1/token sendet, wobei er username und password sendet ein Auth-Token. 

Eine erfolgreiche Antwort wäre ähnlich:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
    "user_display_name": "admin",
    "user_email": "[email protected]",
    "user_nicename": "admin"
}

Dann übergeben Sie das Token bei jeder Anforderungseinstellung an den Anforderungsheader Authorization wie folgt:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8
6
Gui

1. Installiere und aktiviere JWT-Authentifizierung für WP REST API-Plugin , auch installieren WP REST API-Plugin
2. Jetzt können Sie eine beliebige Wordpress-Standard-API von der mobilen App oder einer anderen Quelle oder vom Postboten ausführen. Klicken Sie zum Beispiel auf diese URL von Ihrer App oder vom Postboten. https://example.com/wp-json/wp/v2/posts
3. Per App oder Postbote Wenn Sie sich mit gültigen Angaben anmelden (unter Verwendung von Rest API), erhalten Sie ein Token zurück. Um sich anzumelden und ein Token zu erhalten, führen Sie die folgende URL per Postbote oder App aus https://example.com/wp-json/jwt-auth/v1/token
4. Auf diese Weise erhalten Sie ein Token wie in Bild gezeigt  postman and jwt authentication
Verwenden Sie nun dieses Token, um sich zum Beispiel in Benutzerdetails einzuloggen
5. make function in function.php

function checkloggedinuser()
{
$currentuserid_fromjwt = get_current_user_id();
print_r($currentuserid_fromjwt);
exit;
}

 add_action('rest_api_init', function ()
{
  register_rest_route( 'testone', 'loggedinuser',array(
  'methods' => 'POST',
  'callback' => 'checkloggedinuser'
  ));
});


6. Führen Sie diese neue URL jetzt erneut im Postboten oder in der App aus, um die Benutzerdetails einzusehen . https://example.com/wp-json/testone/loggedinuser (Ersetzen Sie example.com durch Ihre URL)  enter image description here

1
shiv

Ich hatte es mit dem gleichen Problem zu tun, bei dem get_current_user_id () 0 zurückgab. Nach einigen Tests stellte ich fest, dass dies nur beim Senden von POST Requests) der Fall war.

Bei GET-Anforderungen gab die Funktion die angemeldete Benutzer-ID zurück, bei einer POST) -Anforderung gab sie 0 zurück. Dies könnte an einer Serverkonfiguration liegen, die möglicherweise auf einer gemeinsam genutzten Hosting-Umgebung lag Suchen Sie nach Beiträgen oder Kommentaren, die dies bereits erwähnt haben, aber in meinem Fall ist dies der Fall. Eine einfache Lösung könnte darin bestehen, die Benutzer-ID in einer GET-Anforderung an das Frontend zurückzugeben, zu speichern und an POST Anfragen als extra Parameter.

1
SdeWijs

Ich habe zwei Tage lang nach einem einfachen Weg gesucht, ohne Plugins hinzuzufügen.

zuerst in function.php, wo du deine API definierst

//enqueue the script which will use the api
function api_callings_scripts() {
    wp_enqueue_script('score-script', get_template_directory_uri() . '/js/ScoreSaving.js', ['jquery'], NULL, TRUE);
    // Pass nonce to JS.
    wp_localize_script('score-script', 'ScoreSettings', [
      'nonce' => wp_create_nonce('wp_rest'),
    ]);
}
add_action( 'wp_enqueue_scripts', 'api_callings_scripts' ); 

Dann sollte dein Skript Ajax Call Cloud so ähnlich sein

jQuery.ajax({
      type: "POST",
      url: "/wp-json/score/update",
      data: {"var1":"value1"},
      beforeSend: function(xhr) {
        xhr.setRequestHeader('X-WP-Nonce', ScoreSettings.nonce);
      },
    success: 
        function( data ) {
          console.log( data );
        }
    });

Jetzt können Sie get_current_user_id() in Ihrem API-Code verwenden.

0
shady sherif