引言

我在一个WordPress项目中使用了WooCommerce插件,该插件提供了REST API的功能,要使用该功能一个很重要的部分就是授权机制。其中官方文章中关于关于HTTPS的授权说明如下:

Over HTTPS
You may use HTTP Basic Auth by providing the API Consumer Key as the username and the API Consumer Secret as the password.

因此,我就按照WooCommerce官方Step-by-Step文章创建了Consumer Key和Consumer Secret,然后通过REST API也完成了数据的获取、创建、修改等等。

但是,一个要非常注意的地方就是:WooCommerce生成的Key和Secret是无法再次获取到的,如下图红圈中的内容:

什么意思呢?就是说你要把Consumer Key和Consumer Secret自己记录下来,什么时候你需要的时候自己填入进去,我是不会再提供接口让你获取它们了!!!

WTK!现在我既要记住我在WordPress上的登陆账号密码,还要在记住WooCommerce的REST API的Key和Secret。
那么如何通过登录账号密码授权或者在已经登陆授权的情况下获取到该用户的Key和Secret。
要实现上面的功能需求,那么首要的步骤就是了解WooCommerce是如何产生和保存REST API的Key和Secret的。下面我们就从页面开始入手一层层的深入进去。

页面流程

class-wc-settings-api.php页面

WooCommerce插件的REST API设置界面包括以下三个子部分:
代码文件:woocommerce\includes\admin\settings\class-wc-settings-api.php

    /*** Output the settings*/public function output() {global $current_section;if ( 'webhooks' == $current_section ) {WC_Admin_Webhooks::page_output();} else if ( 'keys' == $current_section ) {WC_Admin_API_Keys::page_output();} else {$settings = $this->get_settings( $current_section );WC_Admin_Settings::output_fields( $settings );}}
  1. Settings: 对应woocommerce\includes\admin\class-wc-admin-settings.php文件
  2. API_Keys: 对应woocommerce\includes\admin\class-wc-admin-api-keys.php文件
  3. Webhooks: 对应woocommerce\includes\admin\class-wc-admin-webhooks.php文件

class-wc-admin-api-keys.php页面

在这篇文章中我们主要关注API_Keys部分,也就是class-wc-admin-api-keys.php文件
WC_Admin_API_Keys::page_output()函数的具体实现如下:

    public static function page_output() {// Hide the save button$GLOBALS['hide_save_button'] = true;if ( isset( $_GET['create-key'] ) || isset( $_GET['edit-key'] ) ) {error_log('create-key or edit-key');$key_id   = isset( $_GET['edit-key'] ) ? absint( $_GET['edit-key'] ) : 0;$key_data = self::get_key_data( $key_id );include( 'settings/views/html-keys-edit.php' );} else {error_log('table_list_output');self::table_list_output();}}

从上的代码来看,创建/修改是走一个流程,显示所有的Keys列表时另外一个流程。而对于创建和修改的区分是通过参数中edit-key是否为空来判断。

html-keys-edit.php页面

该页面主要分为两个大块:id为key-fields的div和id为tmpl-api-keys-template的script(type为text/template),其中div部分是设置和生成的时候会用到,而script部分是使用模板来显示生成后的Key、Secret以及二维码。

id为key-fields的div部分包括:

  • 标题
  • 隐藏的key_id字段
  • 具体的key选项字段表格
  • 生成/保存按钮

而key选项字段表格中包括以下几个子项:描述、用户和权限,如果是修改key的页面,还有Consumer Key 末几位以及最后使用时间字段。
这些关于UI的部分,代码不算复杂,此处不再展开。我们重点关注点击生成按钮时的处理。

        if ( 0 == $key_id ) {submit_button( __( 'Generate API Key', 'woocommerce' ), 'primary', 'update_api_key' );}

处理逻辑

创建Key和Secret的具体处理逻辑在woocommerce\includes\class-wc-ajax.php文件的update_api_key()函数,该函数主要包括以下几个部分:

  1. 初始化
  2. 运行环境检查
  3. 输入参数检查
  4. 如果key_id不为空,则是更新key信息的处理
  5. 如果key_id为空,则是创建key信息的处理

在这里我们重点关注如何创建Key和保存到数据库的部分。

            if ( 0 < $key_id ) {// update api key} else {$status          = 2;$consumer_key    = 'ck_' . wc_rand_hash();$consumer_secret = 'cs_' . wc_rand_hash();$data = array('user_id'         => $user_id,'description'     => $description,'permissions'     => $permissions,'consumer_key'    => wc_api_hash( $consumer_key ),'consumer_secret' => $consumer_secret,'truncated_key'   => substr( $consumer_key, -7 ));$wpdb->insert($wpdb->prefix . 'woocommerce_api_keys',$data,array('%d','%s','%s','%s','%s','%s'));$key_id                  = $wpdb->insert_id;$data['consumer_key']    = $consumer_key;$data['consumer_secret'] = $consumer_secret;$data['message']         = __( 'API Key generated successfully. Make sure to copy your new API keys now. You won\'t be able to see it again!', 'woocommerce' );$data['revoke_url']      = '<a style="color: #a00; text-decoration: none;" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'revoke-key' => $key_id ), admin_url( 'admin.php?page=wc-settings&tab=api&section=keys' ) ), 'revoke' ) ). '">' . __( 'Revoke Key', 'woocommerce' ) . '</a>';}

通过上面的代码,我们了解到:
1. consumer_key和consumer_secret是通过wc_rand_hash()函数生成一个随机数再加上固定前缀构成的
2. 存储到数据库中的consumer_key是经过wc_api_hash()函数进行加密的内容,而consumer_secret则是直接进行存储
3. 在数据库中添加了一个truncated_key字段,用来保存consumer_key的末尾7位

wp_woocommerce_api_keys数据表的结构如下:

Field Type Null Key Default Extra
key_id bigint(20) NO PRI NULL auto_increment
user_id bigint(20) NO NULL
description longtext YES NULL
permissions varchar(10) NO NULL
consumer_key char(64) NO MUL NULL
consumer_secret char(43) NO MUL NULL
nonces longtext YES NULL
truncated_key char(7 ) NO NULL
last_access datetime YES NULL

通过代码和表结构的对比,我们发现在创建Key后写入了6个字段的值,而key_id会自动增长后赋值,nonces字段并没有使用到,而last_access字段是用来保存最后一次访问的时间。

总结

分析到这里,我们了解了一个WooCommerce API Keys是如何生成并保存到数据库中的。在下一篇文章中,我们接着分析WooCommerce API接口是如何验证授权信息的。

WooCommerce API Keys的生成和保存机制相关推荐

  1. python调用(百度云、腾讯云)API接口表格识别并保存为excel

    Python表格识别 图像识别具有较高的商业价值,本节主要通过python调用(百度云.腾讯云)API接口表格识别并保存为excel分析表格识别的能力: 提示:需分别申请密钥,在相应位置添加自己密钥即 ...

  2. 猿创征文|小而巧的API文档生成工具之smart-doc

    文章目录 smart-doc介绍 smart-doc特性 smart-doc的最佳搭档 谁在使用smart-doc smart-doc的优缺点 smart-doc和swagger区别比较 smart- ...

  3. php 在线api文档生成,api在线管理,调试,文档生成工具之Apizza

    摘要: Apizza (http://apizza.cc?f=bl) 是国内领先的在线API saas 管理平台,支持在线的API调试,接口管理,快速生成文档,项目管理以及分享. 平台分为开发模式和浏 ...

  4. 小程序通过canvas生成海报保存为图片的技巧

    小程序通过canvas生成海报保存为图片的技巧 最近公司要求在小程序点击分享,要生成一张图片,可以保存在用户相册里,图片里的内容根据后台返回的数据生成,这就涉及到小程序画布的知识了,因为微信文档上,画 ...

  5. 生成,保存和转换pcd点云文件

    原文:http://www.voycn.com/article/jiguangslamshengchengpcddianyundetubaocunhegeshizhuanhuan 关于生成和保存的过程 ...

  6. ASP.NET Web API 使用Swagger生成在线帮助测试文档

    ASP.NET Web API 使用Swagger生成在线帮助测试文档 Swagger-UI简单而一目了然.它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线 ...

  7. 在SAP API hub自动生成使用ABAP调用API的胶水代码

    登录api.sap.com, 找到自己想用ABAP调用的API: API References里,点击Code Snippt, 即可看到API Hub自动生成的使用ABAP调用该API的代码: 要获取 ...

  8. AspnetCore 2.0 自动API文档生成组件,支持protobuffer

    关于 API文档自动生成,用于对APP端的开发帮助文档生成,默认ProtoBuffer传输格式. 本项目并不是RESTful风格,是面向功能的API类型.ApiDoc的作用是根据定义好的API接口和注 ...

  9. ABP框架详解(八)动态ApiController的生成和访问机制

    在ABP框架中提供了一套动态生成ApiController的机制(依然支持原生ApiController的使用方式),虽然说是动态生成ApiController但是实际上并没有真正在启动程序的时候生成 ...

最新文章

  1. IOS微信6.7.4输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置...
  2. B - Average Numbers CodeForces - 134A(水题,思维)
  3. python日志输出 超量 停止_linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查...
  4. VCL组件之TPanel
  5. 309. zui佳买卖股票时机含冷冻期(JavaScript)
  6. php title 乱码,PHP发送UTF-8编码中文邮件标题乱码的解决
  7. 手机拍照普及,相机依然拥有不可替代的优势
  8. 用python画动态图_Python使用matplotlib画动态图
  9. 搭建Prometheus监控报警系统
  10. 【笔记】autoCAD无法显示文字解决方案
  11. 金蝶产品虚拟化解决方案
  12. 字符串中空格相关操作
  13. 超实数探索浪潮波及中国数学界
  14. 今日头条阅读量怎么刷_怎么刷今日头条阅读量?
  15. BI Publisher(rtf)模板开发语法大全
  16. 直流电机控制 pwm 和 pid 算法
  17. Springboot配置Swagger2
  18. 一分钟教会你pdf如何转为PPT,简单易上手
  19. matlab矩阵检索、嵌套,矩阵操作笔记
  20. 如何组装一个注册中心?

热门文章

  1. Python3.0 如何抓取网页
  2. Python错误之 SyntaxError: invalid syntax的解决方法总结
  3. 判断素数(费马小定理)
  4. 手机怎么把视频压缩到最小
  5. java摇号抽奖程序,Excel真的太强大了,能把抽奖功能做成车牌号摇号程序,真是人才...
  6. 移动端键盘弹出后,导致背景图片上移解决方法(MUI)
  7. !-- --与%-- --%
  8. MySQL:日期和时间函数
  9. 时间序列数据分析—概述
  10. SpringBoot开源文档型知识库系统,源代码分享