WP REST API (WP API) 是一个 WordPress 插件,其用途是为 WordPress 核心添加一个 JSON REST API , 以便于像移动应用之类的应用与 WordPress 进行交互。

WP-API 是可扩展的,并且具有齐备的文档,如果你使用 WP REST API (WP API) ,你很可能会被授权问题所困扰。

WP
REST API (WP API)
能让你创建、编辑获取文章 (各种 WordPress 内置的文章类型的文章以及自定义类型的文章) 、创建、编辑和获取用户等,因此,它在某些情形下需要认证
(授权),比如创建和编辑操作,就绝对需要授权才行,否则,处理申请会被 WordPress 拒绝。

据 WP REST API (WP API) 的认证 (授权) 文档来看,认证方式有三种:cookie 、 oauth 和简单认证。本文记录如何实现自定义认证。

据 WordPress 官方开发记录显示:这个插件很可能会在 2015 年 4 月 22 日发布的 WordPress 4.2 版本中加入到 WordPress 核心,那样的话,授权方式可能会有所改变,但不会大变。

举个简单的例子: 某个用户通过手机拍了一张照片,想上传到某个启用了 WP REST API (WP API) 的 WordPress 企业网站源码,那么,就需要认证了吧,那么,怎么做呢?

下面将说一种用于此种情形的认证方式。

用自定义 filter hook

在该插件目录 lib 下有个类文件 class-wp-json-server.php , 其中有这段儿:

  1. /** 
  2.  * Check the authentication headers if supplied 
  3.  * 
  4.  * @return WP_Error|null WP_Error indicates unsuccessful login, null indicates successful or no authentication provided 
  5.  */ 
  6. public function check_authentication() { 
  7.     /** 
  8.      * Pass an authentication error to the API 
  9.      * 
  10.      * This is used to pass a {@see WP_Error} from an authentication method 
  11.      * back to the API. 
  12.      * 
  13.      * Authentication methods should check first if they're being used, as 
  14.      * multiple authentication methods can be enabled on a site (cookies, 
  15.      * HTTP basic auth, OAuth). If the authentication method hooked in is 
  16.      * not actually being attempted, null should be returned to indicate 
  17.      * another authentication method should check instead. Similarly, 
  18.      * callbacks should ensure the value is `null` before checking for 
  19.      * errors. 
  20.      * 
  21.      * A {@see WP_Error} instance can be returned if an error occurs, and 
  22.      * this should match the format used by API methods internally (that is, 
  23.      * the `status` data should be used). A callback can return `true` to 
  24.      * indicate that the authentication method was used, and it succeeded. 
  25.      * 
  26.      * @param WP_Error|null|boolean WP_Error if authentication error, null if authentication method wasn't used, true if authentication succeeded 
  27.      */ 
  28.     return apply_filters( 'json_authentication_errors', null ); 
  29. }

基于上面的这个函数以及其被调用位置,我们可以加进去一个 hook,以确认认证是否成功:

  1. /** 
  2. * WP JSON API 认证检查 
  3. * @param  null 
  4. * @return boolean     是否认证成功 
  5. * @author suifengtec  coolwp.com 
  6. */ 
  7. function coolwp_rest_api_auth_check( $result ){ 
  8.  
  9.    if( 
  10.         !isset($_GET['id']) 
  11.        // ||!isset($_GET['app_key']) 
  12.         ||!isset($_GET['app_token']) 
  13.         ||empty($_GET['id']) 
  14.        // ||empty($_GET['app_key']) 
  15.         ||empty($_GET['app_token']) 
  16.  
  17.  
  18.     ){ 
  19.          return false; 
  20.     } 
  21.  
  22.     //获取从应用 GET 过来的用户 id 、 app_key 和 app_token, 当然了,你也可以只用一个去 app_key 和 app_token 中的任何一个去检查 
  23.     $user_id =  (int)$_GET['id']; 
  24.    // $app_key = sanitize_text_field($_GET['app_key']); 
  25.     $app_token = sanitize_text_field($_GET['app_token']); 
  26.  
  27.     //查询 app_key 和 app_token, 当然了, 你也可以自定义一种算法, 
  28.     //$wp_key = get_user_meta( $user_id, 'app_key', true); 
  29.     $wp_token = get_user_meta( $user_id, 'app_token', true); 
  30.  
  31.  
  32.     //将从应用客户端获取到的值与数据库存储的值进行对比 
  33.     if( 
  34.         ( $wp_token == $app_token ) 
  35.        // &&( $wp_key == $app_key ) 
  36.  
  37.     ){ 
  38.  
  39.        return true; 
  40.     } 
  41.  
  42.     return false; 
  43.  
  44. } 
  45. add_filter('json_authentication_errors', 'coolwp_rest_api_auth_check');

结论

加入 rest api 的 WordPress 甚至可以让你做一个在线支付网站,有了这组 api ,基于 WordPress 的原生安卓应用和 IOS 应用可以更好的与 WordPress 站点进行交互。