WordPress REST API除了自带的外,还可以自己创建一个REST API,但是默认的REST API是没有鉴权的,换句话说是可以远程请求的,这样可能导致被恶意使用。
下面讲讲如何给API鉴权。
Token Authentication
Token鉴权是比较常见和流行的方案,WordPress创建JWT Auth可以实现。安装好后需要在.htaccess
加入:
RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
鉴权还需要安全密匙,访问官方的API:secret-key,将第二行:
define('SECURE_AUTH_KEY'
的值复制下来,把
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
中的your-top-secret-key
替换掉,然后放入wp-config.php
中。
在加入跨域请求:
define('JWT_AUTH_CORS_ENABLE', true);
会生成新的API:
/jwt-auth/v1 /wp-json/jwt-auth/v1/token /wp-json/jwt-auth/v1/token/validate
如何获取Token?
$username = '你的用户名'; $password = '应用密匙'; // 也可以是用户名的真实密码,为了安全,建议使用应用密匙 $jwt = 'https://example.com/wp-json/jwt-auth/v1/token'; $jwt_args = array( 'body' => array( 'username' => $username, 'password' => $password, ), 'sslverify' => false, ); $jwt_res = wp_remote_post( $jwt, $jwt_args ); $jwt_res_body = wp_remote_retrieve_body( $jwt_res ); $jwt_result = json_decode( $jwt_res_body ); $jwt_token = $jwt_result->data->token;
注:应用密匙怎么创建就不说了,网上教程很多。
请求鉴权后的接口
由于鉴权后接口是无法直接访问的,请求时需要带上token
。
$res = wp_remote_get('https://example.com/wp-json/user/v1/all', array( 'headers' => array( 'Authorization' => 'Bearer ' . $jwt_token, ), 'sslverify' => false, ) ); $res_body = json_decode( wp_remote_retrieve_body( $res ) ); var_dump(res_body);
白名单开放受限接口
JWT Auth默认将一些端点列入白名单。 这是为了防止有关 WordPress 和 WooCommerce 的错误。如果想开放更多公共API,请查看:JWT Auth白名单或者插件官方文档。