ESAP达摩院 思想有多远,我们就能走多远

ESAP暗黑教程|打造Oauth2鉴权

2019-04-04
           

客户需求

A公司提供appid和appkey给B公司,B公司使用appid和appkey先从A公司API拿到access_token,再用access_token去请求其他业务数据。

分析和方案

典型的Oauth2鉴权,让数据请求更加安全。

本案演示如何使用ESAP实现完整的请求和处理流程。

实现场景

创建A系统鉴权模板

改造上一篇文章的demo系统,加入oauth2模板。

主要包含appidappkeykeyword三个关键字段,appid和appkey分发给不同供应商使用。

加入accesstoken模板,用于存放accesstoken鉴权,主要包括keyword,accesstoken,createtime三个字段。

Tips: createtime主要用于定期清理过期的accesstoken,本案不再赘述。

构建token鉴权接口

配置好ESAP,在ESAP根目录/sql/api2/下配置gettokensql模板:

{{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错误),效果如下:

更新业务数据请求接口

修改getpurchaseordersql模板,将原来的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


近似文章