Foxtable(狐表)用户栏目专家坐堂 → 火绒api接口调用问题


  共有4744人关注过本帖树形打印复制链接

主题:火绒api接口调用问题

帅哥哟,离线,有人找我吗?
aidimeng
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:803 积分:7707 威望:0 精华:0 注册:2015/9/14 14:26:00
火绒api接口调用问题  发帖心情 Post By:2021/12/10 16:34:00 [只看该作者]

官方给的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
图片点击可在新窗口打开查看

这样的接口怎么调用啊

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110816 积分:564024 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/12/10 16:43:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
aidimeng
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:803 积分:7707 威望:0 精华:0 注册:2015/9/14 14:26:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110816 积分:564024 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/12/10 17:00:00 [只看该作者]

过程开发文档有说了,如果看不懂。找对方要.net的实例抄呗

 回到顶部
帅哥哟,离线,有人找我吗?
aidimeng
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:803 积分:7707 威望:0 精华:0 注册:2015/9/14 14:26:00
  发帖心情 Post By:2021/12/10 17:09:00 [只看该作者]

只有post的例子,没有别的

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110816 积分:564024 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/12/10 17:14:00 [只看该作者]

这个代码是js,用到了jquery和一个加密的类crypto-js。大概逻辑我能看懂,但是没有能力转换为vb的代码。

 回到顶部
帅哥哟,离线,有人找我吗?
aidimeng
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:803 积分:7707 威望:0 精华:0 注册:2015/9/14 14:26:00
  发帖心情 Post By:2021/12/10 17:20:00 [只看该作者]

我对这个接口的验证很晕,完全不懂怎么回事

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110816 积分:564024 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/12/10 17:41:00 [只看该作者]

找对方要.net的例子。如果使用使用js,那要在网页前端使用了,照搬它的js代码和引用js文件即可

 回到顶部