CPI系列 透传REST服务并获取令牌及签名

前言

REST服务是目前接口调用最通用的方式,通用性似乎都超过了WEBSERVICE. 大部分的互联网公司都是用REST方式发布自己的服务. 并且通过https(加密), token(令牌),sign(签名)等机制确保通讯安全.

本文主要讲解怎么通过CPI透传REST服务,并且在CPI中实现获取token及按特定算法加密获取sign(签名)

感谢黄顾问配置IFlow,给作者机会学习IFow中的脚本写法.

Token and Sign

百度了一下Token和Sign的定义.

3f6de072619410a3dfebaa8d6beb4e6b.png

获取token(令牌)

一般的系统会发布一个特定的地址,用来供外围系统调用获取token. 

比如腾讯企业微信的API中就有一个获取token的服务, token 一般会有个有效期, 在有效期内,token可以重复使用. 

在所有其它REST服务中, 都需要在http header 或者 报文中添加 access_token. 服务对接收的token执行验证,验证通过再继续后续的处理.

ba11a627c46100ff5f74fb7ce0505824.png

获取sign(签名)

签名是对本次调用内容的合法性验证. 

一般的签名算法是通过把报文的内容按特定规则组合,进行一次或多次MD5加密. 

服务器会按照相同的算法再次加密,并且把加密后获取的sign与传输的sign 进行对比,通过后才进入服务的后续处理逻辑

CPI透传REST

CPI透传JSON的配置非常简单, 相对复杂的是在这个过程中获取token及签名

该配置的大致逻辑

  • 检查传入的JSON中是否存在token,如果存在,则直接进入签名逻辑.

  • 如果不存在token,准备调用token的报文,调用服务,获取token,并把获取的token加入报文中

  • 按服务提供方提供的签名算法,执行加密过程

  • 把签名结果加入报文中,调用REST服务

  • 在返回结果中补充token信息,返回给调用方

  • 如果调用方传入标记(只获取token和sign),则直接返回获取的token和sign.

91e45749bfd9601f2cd1d723587f0cc5.png

01

IFlow runtime configuration

在IFlow的空白处点击,拖出底部窗口, 可以修改 runtime configuration. 这里可以限制https 允许的抬头参数

bbf3bba3adeca1a96962f0123fa3ed08.png

02

CHECK TOKEN

该节点是个脚本节点.通过GROOVY脚本获取报文信息,判断是否传入了token. 并且把传入报文的通用参数写入消息属性, 以便后续使用(包括原始报文).

c1db1b2d19a87746648cf36f95b767e7.png

fc97e3c90b911466d2afded89fa4f824.png

03

with token

如果传入了有效的token.(token的有效性在发出系统判断,根据token的失效时间判断),直接执行签名步骤

3385b92639773e48b3f278b3784adc5c.png

961ee8cfe90bf1dfd0c69ca0a1b17d4a.png

04

准备获取token的报文

34a46e9f9e0bd3d4a9b561553859e331.png

05

token sign

对获取token的报文添加签名. 通过脚本添加签名

95d74b5009094c33a48133fc0a522d5d.png

6dfe8c76a10b6cc63f2847ac929e39d1.png

06

调用token获取

通过 request replay 节点 调用外部系统的token服务, 获取token信息

d760d454d47c560d6edc72526f8c27d6.png

07

process token

处理令牌

脚本节点, 通过脚本处理获取的token .

获取原始报文,添加token节点,同时把token相关信息写入消息的属性.以便后续使用

8523a9c5c0926ff975c0323fcfb7d56d.png

8bd3100cee9ab62d47b30c52c8fa4d05.png

08

获取签名失败

如果获取签名失败, 结束

ab5a166f53517e44dde54052e6fbeeb4.png

09

sign

签名,脚本节点

对于补充了token的原始报文,添加签名信息

5cff207191e4911d09075c6988d13907.png

4b7eb67ae45c3067196eb7a950521ab4.png

10

仅返回签名

如果调用方传递了抬头参数 get_token_sign. CPI获取token和签名后结束IFlow, 原报文添加token和签名后返回

这个参数的目的: 通过POSTMAN测试目标系统的服务比较麻烦, 所以可以通过CPI服务添加get_token_sign参数来获取该接口的 token ,sign 信息, 然后补充在posman中,以便测试接口

73015910232ffe4f2336f68b0d4aee18.png

11

调用外部系统的服务

通过request reply 节点调用外部系统的正式服务, 传递的报文在原报文基础上补充了token 及sign 部分.

1928ae2ef704994874cdab857c0e9ae4.png

12

return token

脚本节点

把token补充到外部服务返回的信息中. 以便调用系统能够保存token并在下次调用时根据token的失效日期判断是否可以直接使用.以便提高接口的效率(不必每次都调用获取token的接口)

73635868ee1def2aec2c3fc551f0648f.png

S4/ECC端的调用

S4/ECC端调用CPI详见链接

无峰,公众号:ABAP 技巧与实战CPI系列 通用接口-数据写入FTP服务器csv文件

需补充token的存储及有效token的使用逻辑

总结

通过rest方式 传输json报文可以让系统设计一个通用接口, 通过报文的内容识别具体传递的内容及后续处理方式. 

CPI对于这类接口只需要把发出系统的报文透传到目标系统(需要的话,补充token获取或sign获取逻辑, 把相关信息补充到源报文中,再调用目标系统的REST服务).

本文给出了一个CPI通用的处理方式. 其中SIGN签名算法依赖于目标系统给出的逻辑. 其它部分比较通用.

groovy 脚本在CPI中可以比较方便的处理传递的消息.

groovy脚本中通过对message 的抬头,属性及body 的处理,可以改变源系统传递的报文内容.

groovy脚本中通过message 的属性,可以在各脚本间传递变量内容

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

dce40e310038a88e3c0506a30e6f6b63.png

公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

申请进入公众号讨论群提问或者参与话题讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值