WordPress:自定义WP REST API (WP API)授权

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.    if(
  9.         !isset($_GET['id'])
  10.        // ||!isset($_GET['app_key'])
  11.         ||!isset($_GET['app_token'])
  12.         ||empty($_GET['id'])
  13.        // ||empty($_GET['app_key'])
  14.         ||empty($_GET['app_token'])
  15.     ){
  16.          return false;
  17.     }
  18.     //获取从应用GET过来的用户id、app_key和app_token,当然了,你也可以只用一个去app_key和app_token中的任何一个去检查
  19.     $user_id =  (int)$_GET['id'];
  20.    // $app_key = sanitize_text_field($_GET['app_key']);
  21.     $app_token = sanitize_text_field($_GET['app_token']);
  22.     //查询app_key和app_token,当然了,你也可以自定义一种算法,
  23.     //$wp_key = get_user_meta( $user_id, 'app_key', true);
  24.     $wp_token = get_user_meta( $user_id, 'app_token', true);
  25.     //将从应用客户端获取到的值与数据库存储的值进行对比
  26.     if(
  27.         ( $wp_token == $app_token )
  28.        // &&( $wp_key == $app_key )
  29.     ){
  30.        return true;
  31.     }
  32.     return false;
  33. }
  34. add_filter('json_authentication_errors', 'coolwp_rest_api_auth_check');

 

结论

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


error: 错误信息!