客户需求
A公司提供appid和appkey给B公司,B公司使用appid和appkey先从A公司API拿到access_token,再用access_token去请求其他业务数据。
分析和方案
典型的Oauth2鉴权,让数据请求更加安全。
本案演示如何使用ESAP实现完整的请求和处理流程。
实现场景
创建A系统鉴权模板
改造上一篇文章的demo系统,加入oauth2
模板。
主要包含appid
,appkey
和keyword
三个关键字段,appid和appkey分发给不同供应商使用。
加入accesstoken
模板,用于存放accesstoken鉴权,主要包括keyword,accesstoken,createtime三个字段。
Tips: createtime主要用于定期清理过期的accesstoken,本案不再赘述。
构建token鉴权接口
配置好ESAP,在ESAP根目录/sql/api2/
下配置gettoken
sql模板:
{{define "gettoken"}}
declare @accesstoken nvarchar(50)
declare @keyword nvarchar(50)
--验证appid和appkey
set @keyword=(select keyword from oauth2 where appid='{{.appid}}' and appkey='{{.appkey)}}'
if @keyword is not null
begin
--生产accesstoken
set @accesstoken='{{uuid}}'
insert accesstoken(keyword,accesstoken,createtime) values(@keyword,@accesstoken,getdate())
--返回正常的access_token和expires_in
select @accesstoken as access_token,7200 as expires_in
end
else
begin
--返回失败信息
select -1 as errcode,'错误的id或key' as errmsg
end
{{end}}
请求成功时效果如下:
失败时(appkey错误),效果如下:
更新业务数据请求接口
修改getpurchaseorder
sql模板,将原来的name
改为子查询:
{{define "getpurchaseorder"}}
select
订.交期,
订.号,
订.供方,
单.品,
单.品名,
单.数,
单.单位
from 订
inner join 单 on 订.excelserverrcid=单.excelserverrcid
where 订.类='采购'
and 订.供方=(select keyword from accesstoken where accesstoken=:access_token)
{{end}}
升级B公司系统
B公司NX系统在外部接口追加gettoken
接口。
根据esap查询结果,gettoken
关键表结构设置如下:
修改getpurchaseorder
接口,传入参数改为access_token
,其他不变。
修改待确认采购单
模板,增加accesstoken提数公式,通过API提取:
修改外部采购单
提数公式,传入参数改为上一个提数的结果,即access_token:
最终效果
appid和appkey正确时,将获得对应绑定供应商的订单数据:
小结
主要应用esap构建API微服务。
本文涉及的数据库备份可在ESAP水镜禅院中下载。
2019-04-04