借助知行之桥实现OAuth1.0协议调用交易伙伴的API接口

OAuth1.0 介绍

OAuth 是一种开放标准授权协议,允许用户授权第三方应用访问其资源,而不需要向第三方应用透露其用户名和密码。OAuth 1.0 使用 HMAC-SHA1 或 RSA-SHA1 签名方法来对请求进行签名,通过请求令牌、用户授权、交换令牌和使用令牌,确保请求在传输过程中不被篡改,具有较高的安全性。现在OAuth 1.0 已经逐步被其 2.0版本取代,处于弃用状态,如非必要我们也强烈推荐大家使用更新的版本。

需求实现

近期国内物流行业某客户提出这样的需求:他们的交易伙伴要求使用OAuth1.0来调用其API接口,推送指定的JSON格式文件。而知行之桥本身不支持在REST端口仅通过配置实现OAuth1.0,需要通过Script端口写代码实现。实现OAuth1.0的步骤包含生成签名基础字符串 (Signature Base String)、签名密钥 (Signature Key)、计算签名(Signature)、组装授权标头(Authorization Header),并通过REST端口配置组装后的授权标头,将文件POST给交易伙伴。

1.获取 OAuth Auth Token

因为OAuth 1.0 处于弃用状态,所以知行之桥本身不支持从管理界面获取OAuth 1.0 的 Auth Token。但是由于 OAuth 1.0 的 Auth Token是长期有效的。所以,可以借助其它工具获取后,配置在知行之桥中使用即可,比如借助Postman获取,或者直接从交易伙伴那里获取。

2. 构建基础字符串 (Signature Base String)

基础字符串的构建需要包括 HTTP 方法、URL 和参数:

HTTP 方法: POST URL: https://xxx.xxx.xx/xxx/xx/xxx

构建查询参数和OAuth参数

查询参数和 OAuth 参数需要按照字母顺序排序,并进行百分比编码。以下是示例代码:

<!—以下是查询参数-->
<rsb:set attr="t.httpMethod" value="POST"/>
<rsb:set attr="t.url" value="https://xxx.xxx.xx/xxx/xx/xxx"/>
<rsb:set attr="parameters.deploy" value="3"/>
<rsb:set attr="parameters.oauth_consumer_key" value="7eXXXXXXXXXX"/>
<rsb:set attr="parameters.oauth_signature_method" value="HMAC-SHA256"/>
<rsb:set attr="parameters.oauth_timestamp" value="1721197204"/>
<rsb:set attr="parameters.oauth_nonce" value="22dcXXXX"/>
<rsb:set attr="parameters.oauth_version" value="1.0"/>
<rsb:set attr="parameters.oauth_token" value="eecXXXXXXXX"/>
<rsb:set attr="parameters.script" value="880"/>
<rsb:set attr="t.parameterString" value=""/>
<!—拼接所有参数,用&联结,进行百分比编码-->
<rsb:enum item="parameters">
  <rsb:set attr="t.parameterString" value="[t.parameterString][_attr|urlencode]=[_value|urlencode]&"/>
</rsb:enum>
<rsb:set attr="stringLength" value="[t.parameterString | getlength()|subtract(1)]" />
<rsb:set attr="t.parameterString" value="[t.parameterString|substring(0,[stringLength])]"/>
<rsb:set attr="t.baseString" value="[t.httpMethod|urlencode]&[t.url|urlencode]&[t.parameterString|urlencode]"/>
<rsb:set attr="tmp.v" value="[t.baseString]"/>
<!—将编码后的URL中小写字母变成大写-->
<rsb:enum range="1..[tmp.v | getlength]">
  <rsb:if exp="'[tmp.v | substring([_value|add(-1)],1)]' == '%'">
    <rsb:set attr="tmp.v" value="[tmp.v | substring(0,[_value])][tmp.v | substring([_value],1) | toupper][tmp.v | substring([_value|add],1) | toupper][tmp.v | substring([_value|add(2)])]"/>
  </rsb:if>
</rsb:enum>

3. 生成签名密钥 (Signature Key)

签名密钥是由消费者密钥和令牌密钥组成,中间用&分隔并进行百分比编码。

<rsb:set attr="t.baseString" value="[tmp.v]"/>
<rsb:set attr="t.consumerSecret" value="f6b4XXXXXXX"/>
<rsb:set attr="t.tokenSecret" value="b3eaXXXXXXXXX"/>
<rsb:set attr="t.signingKey" value="[t.consumerSecret|urlencode]&[t.tokenSecret|urlencode]"/>

4. 计算签名 (Signature)

使用 HMAC-SHA256 算法计算基础字符串和签名密钥的哈希值,然后进行 Base64 编码。

<rsb:set attr="encIn.format" value="HMAC" /> 
<rsb:set attr="encIn.hmackey" value="[t.signingKey]" /> 
<rsb:set attr="encIn.hmacalgorithm" value="SHA" /> 
<rsb:set attr="encIn.hmacbits" value="256" /> 
<rsb:set attr="encIn.outformat" value="BASE64" />
<rsb:set attr="encIn.data" value="[t.baseString]"/>
<rsb:call op="encEncode" in="encIn" out="encOut">
  <rsb:set attr="t.signature" value="[encOut.encodeddata]"/>
</rsb:call>

5. 组装授权标头 (Authorization Header)

将签名添加到 OAuth 参数中,并构建最终的授权标头。

<rsb:set attr="oauthParams.oauth_consumer_key" value="[parameters.oauth_consumer_key]"/>
<rsb:set attr="oauthParams.oauth_token" value="[parameters.oauth_token]"/>
<rsb:set attr="oauthParams.oauth_signature_method" value="HMAC-SHA256"/>
<rsb:set attr="oauthParams.oauth_timestamp" value="[parameters.oauth_timestamp]"/>
<rsb:set attr="oauthParams.oauth_nonce" value="[parameters.oauth_nonce]"/>
<rsb:set attr="oauthParams.oauth_version" value="1.0"/>
<rsb:set attr="oauthParams.oauth_signature" value="[t.signature]"/>
<rsb:set attr="oauthParams.realm" value="7023245_SB2"/>
<rsb:set attr="t.authHeader" value="OAuth "/>
<rsb:enum item="oauthParams">
  <rsb:set attr="t.authHeader" value='[t.authHeader][_attr|urlencode]="[_value]",'/>
</rsb:enum>
<rsb:set attr="t.headerLength" value="[t.authHeader | getlength()|subtract(1)]" />
<rsb:set attr="t.authHeader" value="[t.authHeader|substring(0,[t.headerLength])]"/><!--授权标头-->

6. 示例输出

基础字符串:

POST&https%3A%2F%2F7023245-sb2.xxxxx.xxx.xx%2Fapp%2Fsite%2Fhosting%2Frestlet.nl&deploy%3D3%26oauth_consumer_key%3D7e62fXXXXXXXX%26oauth_nonce%3D22dcb800b08%26oauth_signature_method%3DHMAC-SHA256%26oauth_timestamp%3D1721197204%26oauth_token%3Deec0XXXXXXX%26oauth_version%3D1.0%26script%3D880

签名密钥:

f6b4XXXXXXXXX&b3eaXXXXXXXXXXXX

签名:

Fkejc1nsNs+Jm0SnevyXhaeCP8VX9ICxtqstsWstvJk=

授权标头: OAuth

oauth_consumer_key=”7e62XXXXXXXX”,oauth_nonce=”22dcXXX”,oauth_signature=”FkejcXXXXXXX=”,oauth_signature_method=”HMAC-SHA256″,oauth_timestamp=”1721197204″,oauth_token=”eec0XXXXXXXX”,oauth_version=”1.0″,realm=”7023245_SB2″

将得到的授权标头写在message header,以便在下一个REST端口使用。

<rsb:set attr="_message.header:authHeader" value="[t.authHeader]"/>
<rsb:push item="output"/>

REST端口调用

在REST端口选择填写“方法和URL”,认证类型选择None,在头部设置参数名称为“Authorization”,值为“[_message.header:authHeader]”。正文类型选择raw,Content Type选择“JSON(application/JSON)”即可。

最后

实际上业务中,OAuth 1.0 并没有OAuth 2.0流行,就是因为其复杂的授权流程,用户体验较差。而OAuth2.0简化了授权流程,提供多种授权模式、提高用户体验、增强灵活性和扩展性、使用 HTTPS 保证安全以及更好的开发者支持等方面,相比 OAuth 1.0 都有显著的优势。因此在未来的选择上,更推荐大家使用OAuth 2.0,借助知行之桥的REST端口,通过界面配置就可实现与交易伙伴的接口对接。

以下是REST端口选择OAuth2.0需要配置的参数:

详细配置说明请点击

如果您希望了解更多有关EDI对接的相关信息,欢迎交流。

阅读原文

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知行EDI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值