2017-02-22 119 views
10

我試圖添加一個自定義請求。如何使用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); 
     } 
    )); 
}); 

和我添加 「X-WP-隨機數」 爲標題的HTTP請求

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

+2

你得到這個工作?你能發佈解決方案嗎?謝謝 – raison

回答

5

Authentication一章,在REST API手冊

Cookie認證是包含在 WordPress中的基本認證方法。當您登錄儀表板時,會爲您正確設置Cookie ,因此插件和主題開發人員只需擁有 登錄用戶即可。

但是,REST API包含一種名爲nonces的技術以避免CSRF 問題。這可以防止其他網站強制您執行操作 而無需明確打算這麼做。這需要對API進行稍微特殊的 處理。

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

對於開發人員進行手動Ajax請求,每個請求傳遞的隨機數將需要爲 。 API使用隨機數,動作設置爲 wp_rest。然後可以通過_wpnonce數據 參數(POST數據或GET請求查詢中)或頭文件將這些數據傳遞給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'); 

創建那麼很有可能你忘記了現時部分 w母雞測試你的自定義端點。

希望它有幫助!

+0

我試過你的解決方案,我更新了我的文章。你能幫忙嗎? –

+1

隨機數必須隨客戶請求一起提供,而不是在其餘服務器的響應中生成。例如,首先嚐試使用客戶端發送nonce的'/ wp-json/wp/v2/users/me /'端點,並讓它顯示當前的用戶信息。 @SemyonTikhonenko – birgire

+2

「該API使用隨機動作設置爲'wp_rest'」是的,我總是改變它,並把它搞砸了。 – WraithKenny

1

如果您更喜歡使用JWT Authentication for WP REST API,那麼使用Json Web令牌可能更容易實現。

首先,您驗證客戶端發送一個HTTP POST請求到端點/WP-JSON/JWT-AUTH/V1 /令牌發送用戶名密碼域生成一個身份驗證令牌。

一個succefull的反應是相似的:

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

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

Authorization: Bear eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8 
相關問題