簡體   English   中英

如何使用 Wordpress Rest Api 獲取當前登錄用戶?

[英]How to get current logged in user using Wordpress Rest Api?

我試圖添加自定義請求。

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

但它總是返回 ID = 0 的用戶; 我也試過這個:

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

它總是返回 false。 但用戶肯定已登錄。

我添加了我的自定義登錄

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

我在 http 請求中將“X-WP-Nonce”添加為 header

現在每個請求輸出: {"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}

REST API Handbook 中Authentication一章:

Cookie 身份驗證是 WordPress 附帶的基本身份驗證方法。 當您登錄儀表板時,這會為您正確設置 cookie,因此插件和主題開發人員只需要一個登錄用戶。

但是,REST API 包含一種稱為 nonces 的技術來避免 CSRF 問題。 這可以防止其他站點在沒有明確意圖的情況下強迫您執行操作。 這需要對 API 進行稍微特殊的處理。

對於使用內置 Javascript API 的開發人員,這會為您自動處理。 這是將 API 用於插件和主題的推薦方式。 自定義數據模型可以擴展 wp.api.models.Base 以確保為任何自定義請求正確發送。

對於進行手動 Ajax 請求的開發人員,每個請求都需要傳遞隨機數。 API 使用 nonce 並將操作設置為wp_rest 然后,這些可以通過_wpnonce數據參數(POST 數據或在 GET 請求的查詢中)或通過X-WP-Nonce標頭傳遞給 API。

這是一個 GET 示例:

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

或者在你的情況下:

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

從哪里創建隨機數

wp_create_nonce( 'wp_rest' );

因此,您很可能在測試自定義端點時忘記了nonce 部分

希望能幫助到你!

我花了兩天時間尋找一種不添加插件的簡單方法。

首先在 function.php 中定義您的 api

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

然后你的腳本 Ajax 調用雲是這樣的

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

現在您可以在 API 代碼中使用get_current_user_id()

1. 為WP REST API插件安裝並激活JWT Authentication ,同時安裝WP REST API插件
2.現在您可以從移動應用程序或任何其他來源或通過郵遞員運行任何 wordpress 默認 api。 例如,從您的應用程序或郵遞員點擊此網址。 https://example.com/wp-json/wp/v2/posts
3.通過應用程序或郵遞員,當您使用有效的詳細信息(使用rest api)登錄時,您將獲得一個令牌。 要登錄並獲取令牌,請通過郵遞員或應用程序運行以下網址https://example.com/wp-json/jwt-auth/v1/token
4.通過這種方式您將獲得如圖所示的令牌郵遞員和 jwt 身份驗證
現在使用此令牌獲取登錄用戶詳細信息,例如
5.在function.php中make函數

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.現在再次在郵遞員或應用程序中運行此新網址以獲取登錄用戶詳細信息。 https://example.com/wp-json/testone/loggedinuser (用你的網址替換example.com) jwt令牌的使用 ( https://i.stack.imgur.com/tIqhS.png )
7.同時根據 pt.wordpress.org/plugins/jwt-authentication-for-wp-rest-api 上的說明編輯您的 .htaccess 文件和 wp-config.php 文件

如果您更喜歡對 WP REST API使用JWT 身份驗證,則使用 Json Web 令牌可能更容易實現。

首先,您對向端點/wp-json/jwt-auth/v1/token發送 HTTP POST 請求的客戶端進行身份驗證,發送用戶名密碼字段以生成身份驗證令牌。

成功的響應類似於:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
    "user_display_name": "admin",
    "user_email": "admin@localhost.dev",
    "user_nicename": "admin"
}

然后你傳遞令牌每個請求設置請求頭授權,如:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8

這是另一種方式

$user_id = ""; //<- add this

add_action( 'rest_api_init', 'add_custom_users_api');

function add_custom_users_api(){
    $GLOBALS['user_id'] = get_current_user_id(); //<- add this

    // route url: domain.com/wp-json/mmw/v1/testing
    register_rest_route( 'mmw/v1', 'testing', array(
        'methods' => 'GET',
        'callback' => 'get_custom_users_data',
    ));
}
//Customize the callback to your liking
function get_custom_users_data(){
    return get_user_by( 'id', $GLOBALS['user_id'] ); //<- add this
}

我正在處理 get_current_user_id() 將返回 0 的相同問題。經過一些測試后,我發現這只是發送 POST 請求時的情況。

對於 GET 請求,該函數返回登錄的用戶 ID,在 POST 請求中返回 0。這可能是由於服務器配置造成的,因為這是在共享托管環境中。 我之前沒有找到任何提及此事的帖子或評論,但這就是我的情況。 一個簡單的解決方法可能是在 GET 請求中將用戶 ID 傳遞回前端,將其存儲並在 POST 請求中作為額外參數發送。

我認為這是在 rest 回調中檢索用戶 ID 的最靈活的方法之一

<?php 

// register route
add_action( 'rest_api_init', function () {
    register_rest_route( 'el-dashboard-api', '/generic-comments', [
        'methods'   => 'GET',
        'callback'  => 'get_generic_comments',
        'login_user_id' => get_current_user_id(), // This will be pass to the rest API callback 
    ]);
});


// rest callback
function get_generic_comments($REST_REQUEST_OBJ){

    // get all the passed attrs
    $attrs =  $REST_REQUEST_OBJ->get_attributes();

    // check is login_user_id set as attr
    if( isset($attrs['login_user_id']) && intval($attrs['login_user_id']) > 0  ){

        $user_id        = intval($attrs['login_user_id']);
        $current_user   = get_user_by( 'id', $user_id );
        
        return "Authorize";

    }
    return "Not authorize";

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM