积分加分API使用签名方法(Signature)对接口进行鉴权。每一次调用积分加分接口的请求都需要在请求中包含签名信息,以验证用户身份。
在第一次使用积分系统加分API之前,需要向积分系统申请安全凭证,安全凭证包括SecretId和SecretKey,SecretId是用来标识API调用者的身份,SecretKey是用于加密签名字符串和服务器验证签名字符串的密钥。SecretKey必须严格保管,避免泄露。已有安全凭证的系统(用户)可以从生成签名开始操作。
申请安全凭证
其他系统第一次使用积分系统进行加分必须先申请安全凭证才可以使用。
- 由系统负责人邮件通知积分系统后台管理员,申请调用积分的加分接口
- 积分系统管理员进入积分系统后台,选择【权限管理】,进入【合作项目】页面,点击【添加项目】
- 在【新建应用】对话框中,【项目id】由积分系统后台自动生成,由积分系统管理员根据邮件内容输入【项目名称】,点击【获取】按钮,由系统自动生成SecretId ,SecretKey。
- 积分系统管理员邮件通知申请调用加分的系统申请得到的SecretId ,SecretKey,并附加confluence接口调用文档地址,以供其调用。
生成签名串
其他系统得到了上一步申请安全凭证,假设生成的的 SecretId 和 SecretKey 分别是:
SecretId:AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA。
SecretKey:Gu5t9xGARNpq86cd98joQYCN3Cozk1qA
调用积分系统加分减分接口 addIntegral请求,请求参数为:
参数 | 参数写法 |
---|---|
方法名 | Action =addIntegral |
密钥ID | SecretId= AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA |
当前时间戳 | Timestamp =1465185768 |
随机正整数 | Nonce=11886 |
加分人的唯一标识id/项目的唯一标识id | givingUserId= 1071008930039197698 |
被加分人的唯一标识id列表 | idInfo= [ “1071008926490816514”, “1071008929686876162” ] |
加分/减分分值 | Integral= 10 |
项目id | pluginId= kernel-free |
加分类型 | primaryId= 1 |
加分理由 | Reason=积极主动,表现优秀,为公司做出突出贡献 |
被加分人唯一标识id | userId |
对参数排序
对请求参数按参数名做字典序升序排列,结果如下:
{
‘Action’ : ‘addIntegral’,
‘givingUserId’:‘1071008930039197698’,
‘idInfo’:’[
“1071008926490816514”,
“1071008929686876162”
]’,
‘integral’:10,
‘Nonce’ : 11886,
‘pluginId’:‘kernel-free’,
‘primaryId’:‘1’,
‘reason’:‘积极主动,表现优秀,为公司做出突出贡献’,
‘SecretId’ : ‘AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA’,
‘Timestamp’ : 1465185768,
‘userId’:’’,
}
拼接请求字符串
把上一步排序好的请求参数,格式化成k=v,然后用“&”拼接在一起,注意v为原始值而非url编码后的值,结果
Action=addIntegral&givingUserId:1071008930039197698&idInfo:[“1071008926490816514”,“1071008929686876162”]&integral:10&Nonce=11886,&pluginId=kernel-free&primaryId=1&v&reason=积极主动,表现优秀,为公司做出突出贡献&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1465185768
拼接签名原文字符串
拼接签名原文时需要如下参数:
请求方法:支持POST方式,这里使用POST请求,注意方法为全大写。
请求主机:dmsdbj.com,详见各接口详细说明
请求路径:kernel-web/integral/addIntegral
请求字符串:上一步生成的
Action=addIntegral&givingUserId:1071008930039197698&idInfo:[“1071008926490816514”,“1071008929686876162”]&integral:10&Nonce=11886,&pluginId=kernel-free&primaryId=1&v&reason=积极主动,表现优秀,为公司做出突出贡献&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1465185768
签名原文的拼接规则为:
请求方法+请求主机+请求路径+?+请求字符串
拼接结果如下
POSTdmsdbj.com/kernel-web/integral/addIntegral?
Action=addIntegral&givingUserId:1071008930039197698&idInfo:[“1071008926490816514”,“1071008929686876162”]&integral:10&Nonce=11886,&pluginId=kernel-free&primaryId=1&v&reason=积极主动,表现优秀,为公司做出突出贡献&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1465185768
生成签名串
- 使用HMAC-SHA1 算法对上面步骤中获得的 签名原文字符串 进行签名。
- 将生成的签名串使用 Base64 进行编码,获得最终的签名串。
以Java语言为例:
secretKey = ’ Gu5t9xGARNpq86cd98joQYCN3Cozk1qA ‘;
srcStr=’ POSTdmsdbj.com/kernel-web/integral/addIntegral?
Action=addIntegral&givingUserId:1071008930039197698&idInfo:[“1071008926490816514”,“1071008929686876162”]&integral:10&Nonce=11886,&pluginId=kernel-free&primaryId=1&v&reason=积极主动,表现优秀,为公司做出突出贡献&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1465185768’;
signStr = base64_encode(hash_hmac(‘sha1’, srcStr, secretKey, true));
得到的签名串为:
HgIYOPcx5lN6gz8JsCFBNAWp2oQ=
添加签名,发送请求
请求参数中添加Signature参数,参数值为上一步生成的签名串,并且对签名进行url编码。上面生成的签名HgIYOPcx5lN6gz8JsCFBNAWp2oQ=,编码后为HgIYOPcx5lN6gz8JsCFBNAWp2oQ%3D
如果是使用GET方法,则对所有请求参数的参数值做URL编码;若使用POST则除Signature参数外无需URL编码
发送HTTPS协议请求即可得到JSON字符串格式的接口返回值
最终的请求URL为:
https://dmsdbj.com/kernel-web/integral/addIntegral
&Action=addIntegral&givingUserId:1071008930039197698,
&idInfo:[“1071008926490816514”,“1071008929686876162”]
&integral:10
&Nonce=11886,
&pluginId=kernel-free
&primaryId=1
&v&reason=积极主动,表现优秀,为公司做出突出贡献
&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
&Signature=HgIYOPcx5lN6gz8JsCFBNAWp2oQ%3D
&Timestamp=1465185768
错误码:
回调函数
<未完,待续更新>