以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  火绒api接口调用问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=173664)

--  作者:aidimeng
--  发布时间:2021/12/10 16:34:00
--  火绒api接口调用问题
官方给的api调用说明,看了半天没看懂

1. API接口使用认证机制

您可以使用AccessKey构造一个API请求来操作资源。AccessKey包括AccessKey ID和AccessKey Secret。
AccessKey ID用于标识用户。
AccessKey Secret是用来验证用户的密钥。
AccessKey Secret必须保密。

Header中包含签名

您可以在HTTP请求中增加 Authorization 的Header来包含签名(Signature)信息,表明这个消息已被授权。

Authorization字段计算的方法

Authorization = "HRESS " + AccessKeyId + ":" + Expires + ":" + Signature

Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
          AccessKeyId + "\\n" 
          + expires + "\\n"
          + HTTP-METHOD + "\\n" 
          + Content-MD5 + "\\n"
          + CanonicalizedResource)))

在URL中包含签名

除了使用Authorization Header,您还可以在URL中加入签名信息,以便将该URL转给第三方实现授权访问。

示例代码

http://localhost/api/group/_list?ak=AccessKeyId&expires=1619688871&sign=Signature
http://localhost/api/group/_info?group_id=1&ak=AccessKeyId&expires=1619688871&sign=Signature

Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
          AccessKeyId + "\\n" 
          + expires + "\\n"
          + HTTP-METHOD + "\\n" 
          + Content-MD5 + "\\n"
          + CanonicalizedResource)))

构建CanonicalizedResource的方法

用户发送请求中想访问的火绒企业版目标资源被称为CanonicalizedResource,它的构建方法如下:

  1. 将CanonicalizedResource置为空字符串""。
  2. 设置要访问资源"api/group/_info"
  3. 如果请求的资源包括子资源(SubResource) ,那么将所有的子资源按照字典序,从小到大排列并以&为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加?和子资源字符串。此时的CanonicalizedResource为api/group/_info?group_id=1

Content-MD5的计算方法

RFC2616 Content-MD5

  1. 先计算MD5加密的二进制数组(128位)
  2. 对这个二进制数组进行base64编码(而不是对32位字符串编码)。

计算规则

  1. 计算 HMAC 值 按照RFC2104
    的定义,使用上述步骤得到的字符串计算签名HMAC SHA1值。
  2. 计算签名值 按照Base64
    编码规则把上一步骤中的HMAC值编码成字符串,即得到签名值
  3. 将签名字符串放到URL时,须对URL进行urlencode

2. 请求参数规则

统一使用 HTTP-POST JSON 方式传递

2.1 统一响应数据

参数名称类型示例是否必须描述
errnoint0响应错误码
errmsgstring"Authentication Failed"错误信息 errno==0时 为空字符串
dataobject{...}返回的数据 以接口描述为准

2.2 响应错误码

errnoerrmsg说明
0""API接口调用成功
1"Authentication failed"认证失败,根据API认证参数无法通过认证
2"Invalid parameter"参数错误,调用API接口时
3"Internal server error"服务器内部错误








图片点击可在新窗口打开查看此主题相关图片如下:qq截图20211210163243.jpg
图片点击可在新窗口打开查看

这样的接口怎么调用啊

--  作者:有点蓝
--  发布时间:2021/12/10 16:43:00
--  
有点类似这种:http://www.foxtable.com/webhelp/topics/3389.htm
--  作者:aidimeng
--  发布时间:2021/12/10 16:50:00
--  
看了下 完全不懂是怎么回事,能否简单提示下过程啊

他们给了 postman的代码

3.复制以下代码到postman

const crypto = require(\'crypto-js\')

const secret_key = " K4ALMI1PM1T3X0235RSI"

const secret_id = " 41GV47B3ZQ"

let expires = new Date().getTime()+604800000 //过期时间

const body = pm.request.body

 

const md5Bytes = crypto.MD5(""+body+"")

const contentMD5 = CryptoJS.enc.Base64.stringify(md5Bytes)

const path = pm.request.url.getPath()

let canonicalizedResource = path.replace(\'/\'\'\')

 

// 参数排序

let sortedParams = []

pm.request.url.query.each(p=>{

    if(p.key === \'{{query_para}}\'){

        return

    }

    if (sortedParams.length == 0){

        sortedParams.push(p)

    }else{

        let inserted = false

        for(var i =0i < sortedParams.lengthi++){

            if(sortedParams[i].key > p.key){

                sortedParams.splice(i0p)

                inserted = true

                break

            }

        }

        if (!inserted){

            sortedParams.push(p)

        }

    }

    

})

if(sortedParams.length>0){

    canonicalizedResource += \'?\'

    sortedParams.forEach(p=>{

        canonicalizedResource += `${p.key}=${p.value}&`

    })

    canonicalizedResource = canonicalizedResource.substring(0canonicalizedResource.length-1)

}

 

const stringToSign = `${secret_id}\\n${expires}\\n${pm.request.method}\\n${contentMD5}\\n${canonicalizedResource}`

let hash = crypto.HmacSHA1(stringToSignsecret_key)

let sign = hash.toString(crypto.enc.Base64)

//使用header验证,需要header中添加 Authorization {{auth_header}}

let authInfo = `HRESS${secret_id}:${expires}:${sign}`

pm.collectionVariables.set("auth_header"authInfo)

//使用uri验证,需要url后加 ?{{query_para}}

pm.collectionVariables.set("query_para"`ak=${secret_key}&expires=${expires}&sign=${sign}`)


[此贴子已经被作者于2021/12/10 16:59:15编辑过]

--  作者:有点蓝
--  发布时间:2021/12/10 17:00:00
--  
过程开发文档有说了,如果看不懂。找对方要.net的实例抄呗
--  作者:aidimeng
--  发布时间:2021/12/10 17:09:00
--  
只有post的例子,没有别的
--  作者:有点蓝
--  发布时间:2021/12/10 17:14:00
--  
这个代码是js,用到了jquery和一个加密的类crypto-js。大概逻辑我能看懂,但是没有能力转换为vb的代码。
--  作者:aidimeng
--  发布时间:2021/12/10 17:20:00
--  
我对这个接口的验证很晕,完全不懂怎么回事
--  作者:有点蓝
--  发布时间:2021/12/10 17:41:00
--  
找对方要.net的例子。如果使用使用js,那要在网页前端使用了,照搬它的js代码和引用js文件即可