从0到1自建内部使用的API授权平台竟然那么容易?!

112 阅读9分钟

大家好,最近看了一些API的管理平台如API LayerboomiOdoo等平台,思考如果自己动手搭建一个API授权平台是否困难,结果透过网上的资源就能搭建起一个简易且可扩展API授权平台,且大部份依赖的功能都可免费体验,下文就来跟大家分享一下这次搭建的代码跟使用到的工具,希望想要在公司内部建立自用的API授权平台能很快地实现。 

GitHub代码库: github.com/datafe/api-…

Demo

视频链接

image.png

Getting Start

直接动手开始搭建从API上线到用户申请API与调用API。

  1. 依赖的服务及工具

阿里云帐号申请网址费用: 免费
DataWorks (包含数据服务)开通网址费用: 基础版不限时长免费试用、专业版限时特价体验
阿里云网关开通网址费用: 计费说明 (共享实例月累计1千万次调用以下,每万次0.06人民币)
Linux服务器自建或申请云厂商服务器

DataWorks数据服务功能强大,可基于多种数据引擎 (StarRocks/Hologres/MaxCompute/HBase/OTS/MySQL/PostgreSQL/Snowflake/Redshift) 开发上层API,也能注册已有的API,此文为搭建用户授权平台,为求演示方便,此示例以注册API节点为例,更详细的功能可参考产品操作指南

image

  1. 准备一个要提供被订阅的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"}]}}
  1. 打开DataWorks数据服务并注册API (建立API之前需要先建立业务流程,新建业务流程需要绑定一个网关分组)

image

于新建注册API弹框填入以下必填信息,并送出

API 名称: hk_current_weather_info
API Path: /hk_current_weather_info
描述: get Hong Kong current weather info
目标文件夹: 选一个已先建立好的业务流程

image

建立注册API后,于打开的新节点填入以下信息 (若原API有认证信息,可放置于常量参数,DataWorks数据服务会对外隐藏常量参数)

后台服务 Host: https://data.weather.gov.hk
后台服务 Path: /weatherAPI/opendata/weather.php
请求参数:
参数名 dataType 默认值 rhrread
参数名 lang 默认值 en

image

点右上角测试按钮 (或按F8),测试成功后,关闭弹框,点右上角提交

image

提交成功后,自动会打开右侧版本,点发布按钮,发布API成功后,开始建立自建的授权平台

image

  1. 下载此代码压缩档 (至此GitHub下载product-code.zip) 并解压缩,修改server/OpenApiClient.js的AK信息,AK信息可从阿里云访问控制上获取,而后将代码放置到Linux服务器。

image

  1. 于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

image

看到 express running at http://localhost:3001 即已运行成功

  1. 打开网址后点Go to Register或打开/register注册页,注册一个用户帐号,注册成功后,可以在API网关应用列表看到新增的用户。

image

image

image

  1. 使用新建的用户登录 (密码默认为test,可以在server/index.js里修改)

image

  1. 登录后,查看上线的APIs,即可看到我们建立的hk_current_weather_info API,点Apply进行申请。申请成功后可在Authorized APIs查看,点Details查看API调用信息。

image

image

image

  1. 点Authorized Info查看调用认证信息,并用curl验证是否可打通

curl 'http://fullpath?appCode=yourAppCode'

image

image

架构图

首先先介绍一下API平台大概包含几种使用场景:

  • 开发者开发API (测试与版本管理)

  • 管理者管理API (发布与下线)

  • 用户调用API (安全审核)

  • 用户管理API (订阅/退订)

我们这次搭建重点在用户管理API的场景,并会介绍其代码实作细节与运作方式,下面就四个场景分别介绍。

开发者开发API

image

一开始最重要的是要提供怎样的API出来,且还能让一群开发者共同开发各式各样的APIs,需要有数据源管理、SQL开发、版本管理、测试环境、函数计算等功能,这边我们使用DataWorks数据服务来承担此角色,且开通DataWorks基础版不收取费用。DataWorks数据服务还能注册既有的API,能封装隐藏原认证信息,注册后即可管理 (支持版本管理)。

image

image

image

管理者管理API

image

针对开发出来的APIs进行上线后的处理,更偏重于计量、日志分析、授权管理、限流等工作,DataWorks数据服务都支持这些重要功能,开通DataWorks基础版不收取费用,再搭配阿里云网关管理,事半功倍。

image

image

image

image

用户调用API

image

API上线后,调用的方式可以透过curl指令或Postman进行测试调用,应用里调用可参考各编程语言调用HTTP Request的方法。调用时的认证方式可以参考阿里云网关认证方式

image

用户管理API

image

此篇重点实作的部份在上图黄色区域,透过DataWorks数据服务阿里云网关,就能建立起自己的API授权平台,且开通DataWorks基础版不收取费用。(透过阿里云网关能上架API到阿里云API市场,不在本篇讨论范围)

实作介绍

平台使用到Node.js+React来实现。

实现方式

后端实现方式

主要有三个部份:

  • 对接阿里云 (封装AK、Open API)

  • 前端接口 (前端使用、登录态管理)

  • 运行

对接阿里云

生产调用阿里云Open API的客户端(封装了自用AK),AK可从阿里云访问控制上获取,放置服务端环境参数或直接替换下图参数即可。

image

参考Open API的SDK示例来添加调用实现,如下图的查询已发布API列表,透过上图的阿里云Open API的客户端实例进行调用。

image

image

前端接口

使用Express.js运行后端

image

对外透出接口给前端,并对内调用Open API

image

建立一个简易的登录态管理 (建议使用Redis或数据库管理)

image

登录密码此处需要自行实作,目前写定为 test

image

运行

安装Node.js后,透过NPM安装Yarn,打指令npm install --global yarn,安装完后进入到server文件夹,透过指令yarn & yarn start即可运行服务,默认接口为3001 (可自行修改)

cd server
npm install --global yarn # 若安装过yarn可跳过此步
yarn install # 若安装过,可跳过此步
yarn start

image

需先打包完前端生产代码(于client文件夹的dist文件夹)后,于浏览器直接打开http://localhost:3001,就能打开生产环境。

image

前端实现方式

前端采用React方式实现,透过Vite打包脚本,开发环境后端proxy默认为http://localhost:3001(可修改)

image

开发代码放置src文件夹里,pages内列出每一页的代码。

image

登入页面后,这边实现了简单的登入态检查,可统一封装在请求对象里。

image

开发运行方式为,先安装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

image

打包生产,进入到client文件夹打指令yarn build,即会打包生产代码于dist文件夹。

cd client
npm install --global yarn # 若安装过yarn可跳过此步
yarn & yarn build

image

API市集

此页列出所选地域已上架的线上API(代码于client/src/pages/ApiHome/ApiList/index.tsx),用户可以点Apply进行订阅使用。

image

点选Apply后即跳出弹框,若有其它计费或特殊流程可于此部骤进行扩展。

image

地域选单可于client/src/pages/ApiHome/ApiList/index.tsx文档进行修改。

image

已授权API列表

此页列出用户所有地域有权限使用的线上API(代码于client/src/pages/ApiHome/AuthorizedApiList/index.tsx),用户可以点Remove进行退订。

image

image

API详情

在API表格最右侧点Details,即可呼出详情,会列出调用API支持的协议与调用参数信息等,代码可参考client/src/pages/ApiHome/ApiDetails/index.tsx。

image

API调用认证

代码可参考client/src/pages/ApiHome/AuthorizedInfo/index.tsx。

image

登录

登录页代码于client/src/pages/Login/index.tsx,可自行修改样式或内容。

image

注册

登录页代码于client/src/pages/Register/index.tsx,可自行修改样式或内容。

image

部署

透过云厂商部署一个Node.js服务器可以参考此篇文章,或著自建一个Linux服务器安装Node.js,可以参考官方文档

相关 Open APIs

查询API列表 next.api.aliyun.com/api/CloudAP…

建立应用 next.api.aliyun.com/api/CloudAP…

重置应用密钥 next.api.aliyun.com/api/CloudAP…

查询应用密钥 next.api.aliyun.com/api/CloudAP…

查询应用列表 next.api.aliyun.com/api/CloudAP…

对一个应用授权多个API权限 next.api.aliyun.com/api/CloudAP…

对一个API授权多个应用权限 next.api.aliyun.com/api/CloudAP…

对一个应用撤销多个API权限 next.api.aliyun.com/api/CloudAP…

对一个API撤销多个应用权限 next.api.aliyun.com/api/CloudAP…

源代码参考

GitHub github.com/datafe/api-…

(附) Aliyun ECS + Node.js 部署 (中国区)

此为使用阿里云 ECS 部署此 API 授权平台的步骤

  1. 购买 Aliyun ECS 按量付费,链接

按需购买规格,使用 CentOS,若要对外需加购公网 IPv4 地址。

  1. 修改实例登录密码,链接

  1. 设定安全组访问规则,需要 443,链接

  1. 透过 Workbench 连接实例,参考此链接安装环境,然后安装 Node 版本 v16.16.0。

## 安装完 NVM 后,使用 v16.16.0 版本
nvm use 16.16.0
  1. 透过左侧选单界面上传 product-code.zip 至 /opt。

  1. 安装 unzip 指令,并解压缩 product-code.zip。
cd /opt
yum install unzip -y
unzip product-code.zip -d api-market
  1. 安装 cnpm 取代 npm,参考链接
npm install cnpm -g --registry=https://registry.npmmirror.com
cd /opt/api-market/server
cnpm install
  1. 打开 /opt/api-market/server/index.js,修改伺服器 Port 至 443 (可于左边侧边栏对文档按右键或双击文档,使用编辑器修改内容)。

  1. 阿里云获取主帐号 AK 信息,进入到 /opt/api-market 修改 server/OpenApiClient.js AK 信息。

  1. 运行伺服器。
cd /opt/api-market/server
cnpm start

  1. 安装长驻套件 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 证书可以至阿里云免费申请,链接