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 参数需要按照字母顺序排序,并进行百分比编码。以下是示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<!—以下是查询参数--> <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)
签名密钥是由消费者密钥和令牌密钥组成,中间用&分隔并进行百分比编码。
1 2 3 4 |
<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 编码。
1 2 3 4 5 6 7 8 9 |
<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 参数中,并构建最终的授权标头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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. 示例输出
基础字符串:
1 |
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端口使用。
1 2 |
<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对接的相关信息,欢迎联系我们。
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。