大家好,最近看了一些API的管理平台如API Layer、boomi、Odoo等平台,思考如果自己动手搭建一个API授权平台是否困难,结果透过网上的资源就能搭建起一个简易且可扩展API授权平台,且大部份依赖的功能都可免费体验,下文就来跟大家分享一下这次搭建的代码跟使用到的工具,希望想要在公司内部建立自用的API授权平台能很快地实现。
GitHub代码库: https://github.com/datafe/api-market
Demo
视频链接
Getting Start
直接动手开始搭建从API上线到用户申请API与调用API。
- 依赖的服务及工具
DataWorks数据服务功能强大,可基于多种数据引擎 (StarRocks/Hologres/MaxCompute/HBase/OTS/MySQL/PostgreSQL/Snowflake/Redshift) 开发上层API,也能注册已有的API,此文为搭建用户授权平台,为求演示方便,此示例以注册API节点为例,更详细的功能可参考产品操作指南。
- 准备一个要提供被订阅的API (基于示例演示方便,这边参考免费公开接口,如查询香港当前气候信息)
curl https://data.weather.gov.hk/weatherAPI/opendata/weather.php?dataType=rhrread&lang=en # {"temperature": {"data":[{"place":"Tsuen Wan Ho Koon","value":20,"unit":"C"}]}}
- 打开DataWorks数据服务并注册API (建立API之前需要先建立业务流程,新建业务流程需要绑定一个网关分组)
于新建注册API弹框填入以下必填信息,并送出
API 名称: hk_current_weather_info API Path: /hk_current_weather_info 描述: get Hong Kong current weather info 目标文件夹: 选一个已先建立好的业务流程
建立注册API后,于打开的新节点填入以下信息 (若原API有认证信息,可放置于常量参数,DataWorks数据服务会对外隐藏常量参数)
后台服务 Host: https://data.weather.gov.hk 后台服务 Path: /weatherAPI/opendata/weather.php 请求参数: 参数名 dataType 默认值 rhrread 参数名 lang 默认值 en
点右上角测试按钮 (或按F8),测试成功后,关闭弹框,点右上角提交
提交成功后,自动会打开右侧版本,点发布按钮,发布API成功后,开始建立自建的授权平台
- 下载此代码压缩档 (至此GitHub下载product-code.zip) 并解压缩,修改server/OpenApiClient.js的AK信息,AK信息可从阿里云访问控制上获取,而后将代码放置到Linux服务器。
- 于Linux服务器安装Node.js(安装参考或参考附录),透过NPM安装Yarn,打指令npm install --global yarn,安装完后透过指令yarn install-server & yarn start即可运行服务,默认接口为3001 (可自行修改server/index.js里的port设定)
npm install --global yarn yarn install-server & yarn start
看到 express running at http://localhost:3001 即已运行成功
- 打开网址后点Go to Register或打开/register注册页,注册一个用户帐号,注册成功后,可以在API网关应用列表看到新增的用户。
- 使用新建的用户登录 (密码默认为test,可以在server/index.js里修改)
- 登录后,查看上线的APIs,即可看到我们建立的hk_current_weather_info API,点Apply进行申请。申请成功后可在Authorized APIs查看,点Details查看API调用信息。
- 点Authorized Info查看调用认证信息,并用curl验证是否可打通
curl'http://fullpath?appCode=yourAppCode'
架构图
首先先介绍一下API平台大概包含几种使用场景:
- 开发者开发API (测试与版本管理)
- 管理者管理API (发布与下线)
- 用户调用API (安全审核)
- 用户管理API (订阅/退订)
我们这次搭建重点在用户管理API的场景,并会介绍其代码实作细节与运作方式,下面就四个场景分别介绍。
开发者开发API
一开始最重要的是要提供怎样的API出来,且还能让一群开发者共同开发各式各样的APIs,需要有数据源管理、SQL开发、版本管理、测试环境、函数计算等功能,这边我们使用DataWorks数据服务来承担此角色,且开通DataWorks基础版不收取费用。DataWorks数据服务还能注册既有的API,能封装隐藏原认证信息,注册后即可管理 (支持版本管理)。
管理者管理API
针对开发出来的APIs进行上线后的处理,更偏重于计量、日志分析、授权管理、限流等工作,DataWorks数据服务都支持这些重要功能,开通DataWorks基础版不收取费用,再搭配阿里云网关管理,事半功倍。
用户调用API
API上线后,调用的方式可以透过curl指令或Postman进行测试调用,应用里调用可参考各编程语言调用HTTP Request的方法。调用时的认证方式可以参考阿里云网关认证方式。
用户管理API
此篇重点实作的部份在上图黄色区域,透过DataWorks数据服务和阿里云网关,就能建立起自己的API授权平台,且开通DataWorks基础版不收取费用。(透过阿里云网关能上架API到阿里云API市场,不在本篇讨论范围)
实作介绍
实现方式
后端实现方式
主要有三个部份:
- 对接阿里云 (封装AK、Open API)
- 前端接口 (前端使用、登录态管理)
- 运行
对接阿里云
生产调用阿里云Open API的客户端(封装了自用AK),AK可从阿里云访问控制上获取,放置服务端环境参数或直接替换下图参数即可。
参考Open API的SDK示例来添加调用实现,如下图的查询已发布API列表,透过上图的阿里云Open API的客户端实例进行调用。
前端接口
使用Express.js运行后端
对外透出接口给前端,并对内调用Open API
建立一个简易的登录态管理 (建议使用Redis或数据库管理)
登录密码此处需要自行实作,目前写定为 test
运行
安装Node.js后,透过NPM安装Yarn,打指令npm install --global yarn,安装完后进入到server文件夹,透过指令yarn & yarn start即可运行服务,默认接口为3001 (可自行修改)
cd server npm install --global yarn # 若安装过yarn可跳过此步yarn install # 若安装过,可跳过此步yarn start
需先打包完前端生产代码(于client文件夹的dist文件夹)后,于浏览器直接打开http://localhost:3001,就能打开生产环境。
前端实现方式
前端采用React方式实现,透过Vite打包脚本,开发环境后端proxy默认为http://localhost:3001(可修改)
开发代码放置src文件夹里,pages内列出每一页的代码。
登入页面后,这边实现了简单的登入态检查,可统一封装在请求对象里。
开发运行方式为,先安装Node.js,并透过NPM安装Yarn,打指令npm install --global yarn,安装完后进入到client文件夹,打指令yarn & yarn start,即自动打开浏览器 http://localhost:3000/
cd client npm install --global yarn # 若安装过yarn可跳过此步yarn install # 若安装过,可跳过此步yarn start
打包生产,进入到client文件夹打指令yarn build,即会打包生产代码于dist文件夹。
cd client npm install --global yarn # 若安装过yarn可跳过此步yarn & yarn build
API市集
此页列出所选地域已上架的线上API(代码于client/src/pages/ApiHome/ApiList/index.tsx),用户可以点Apply进行订阅使用。
点选Apply后即跳出弹框,若有其它计费或特殊流程可于此部骤进行扩展。
地域选单可于client/src/pages/ApiHome/ApiList/index.tsx文档进行修改。
已授权API列表
此页列出用户所有地域有权限使用的线上API(代码于client/src/pages/ApiHome/AuthorizedApiList/index.tsx),用户可以点Remove进行退订。
API详情
在API表格最右侧点Details,即可呼出详情,会列出调用API支持的协议与调用参数信息等,代码可参考client/src/pages/ApiHome/ApiDetails/index.tsx。
API调用认证
代码可参考client/src/pages/ApiHome/AuthorizedInfo/index.tsx。
登录
登录页代码于client/src/pages/Login/index.tsx,可自行修改样式或内容。
注册
登录页代码于client/src/pages/Register/index.tsx,可自行修改样式或内容。
部署
透过云厂商部署一个Node.js服务器可以参考此篇文章,或著自建一个Linux服务器安装Node.js,可以参考官方文档。
相关 Open APIs
查询API列表 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/DescribeDeployedApis
建立应用 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/CreateApp
重置应用密钥 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/ResetAppSecret
查询应用密钥 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/DescribeAppSecurity
查询应用列表 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/DescribeAppAttributes
对一个应用授权多个API权限 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/SetApisAuthorities
对一个API授权多个应用权限 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/SetAppsAuthorities
对一个应用撤销多个API权限 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/RemoveApisAuthorities
对一个API撤销多个应用权限 https://next.api.aliyun.com/api/CloudAPI/2016-07-14/RemoveAppsAuthorities
源代码参考
GitHub https://github.com/datafe/api-market
(附) Aliyun ECS + Node.js 部署 (中国区)
此为使用阿里云 ECS 部署此 API 授权平台的步骤
- 购买 Aliyun ECS 按量付费,链接
按需购买规格,使用 CentOS,若要对外需加购公网 IPv4 地址。
- 修改实例登录密码,链接
- 设定安全组访问规则,需要 443,链接
- 透过 Workbench 连接实例,参考此链接安装环境,然后安装 Node 版本 v16.16.0。
## 安装完 NVM 后,使用 v16.16.0 版本 nvm use 16.16.0
- 透过左侧选单界面上传 product-code.zip 至 /opt。
- 安装 unzip 指令,并解压缩 product-code.zip。
cd /opt yum install unzip -y unzip product-code.zip -d api-market
- 安装 cnpm 取代 npm,参考链接
npm install cnpm -g --registry=https://registry.npmmirror.com cd /opt/api-market/server cnpm install
- 打开 /opt/api-market/server/index.js,修改伺服器 Port 至 443 (可于左边侧边栏对文档按右键或双击文档,使用编辑器修改内容)。
- 从阿里云获取主帐号 AK 信息,进入到 /opt/api-market 修改 server/OpenApiClient.js AK 信息。
- 运行伺服器。
cd /opt/api-market/server cnpm start
- 安装长驻套件 pm2,让伺服器可以一直运行
cd /opt/api-market/server cnpm install -g pm2 ## 启动 cnpm run pm2-start ## 启动 使用所有CPU核心的集群 cnpm run pm2-start-max ## 停止 cnpm run pm2-stop ## 停止所有 cnpm run pm2-stop-all ## 重启 cnpm run pm2-restart ## 重启所有 cnpm run pm2-restart-all ## 关闭 cnpm run pm2-delete
如网站需要三方公证的 SSL 证书可以至阿里云免费申请,链接