# 安全相关
为了保证接口调用的安全性,腾讯小微对接口调用做了一些调用限制,主要从2个方面来实现的。分别是IP访问白名单、接口鉴权。
# 访问白名单
目前只允许调用方提供的IP地址请求相关接口。请联系开发人员添加调用方出口IP。
# 接口鉴权
小微所签发的token凭证,在小微整个体系下通用,对于小微sdk、IOT等小微体系服务方签发的token凭证,在小微云对接是通用的,直接使用已经获取的token凭证请求云对接即可,不需要在云对接进行获取token凭证。同样,小微云对接获取的token凭证,在小微体系内同样可以鉴权通过。
在小微体系内没有获取过token凭证,则首先需要在云对接获取token凭证,才能继续请求云对接服务。目前安全主要是依靠鉴权来保证业务接口安全。从小微官网获取的秘钥信息是主要的鉴权凭据,需要根据该秘钥信息验证请求来源的合法性,获取相应的token凭证信息,才可以正确获取业务数据。
从小微云对接获取token凭证有2种方式,第一种获取token凭证方式,不注入业务请求参数,待废弃;第二种获取token凭证时注入不变的业务请求参数,优点是后续请求业务接口时,不需要传递已经注入的参数,推荐使用第二种方式获取token凭证。
# 获取token凭证接口
请求地址: https://{BASE_URL}/xwcloudapi/auth_get_token BASE_URL详见基础说明章节中的基础规则。
请求方法: post
# 获取token凭证:待废弃
请求参数:
field name | field type | required | Desc |
---|---|---|---|
pid | int | Yes | 小微硬件平台注册获取的AppUin |
timestamp | Int | Yes | 当时的Unix秒级时间戳timestamp, |
code | String | Yes | 计算方法为sha256(signkey)或者md5(signkey),其中md5加密方式待废弃,推荐使用sha256。 signkey=secretkey+str(pid)+str(timestamp) |
refresh | int | optional | 是否强制刷新,强制刷新为 1,默认为0,既不刷新 |
请求示例:
比如pid为2011189 当前timestamp为 1575851427 分配secret_key:为iurwbrydfksaflhcc
计算code为:
sha256("iurwbrydfksaflhcc20111891575851427") = 412772014d96df740bbd7ad1260524eedad4ef645e3181b8b2b51ce96f41b4cb
因此请求是:
{
"pid": 2011189,
"timestamp": 1575851427,
"code":"412772014d96df740bbd7ad1260524eedad4ef645e3181b8b2b51ce96f41b4cb"
}
返回参数:
field name | field type | Desc |
---|---|---|
code | int | 返回错误码 0成功非零失败 |
msg | string | |
data.access_token | string | 安全鉴权字段 用于后续请求接口鉴权,填入请求参数的auth字段 |
data.expires_in | int | 过期时间 单位s |
返回示例:
{
"code": 0,
"msg": "OK",
"data": {
"access_token": "ksfjkasjfslkdajfuoieruoieur",
"expires_in": 3600
}
}
注意: 获取到的accesstoken 是该pid下全局有效的,意味着如果该pid的重新调用刷新获取安全凭据接口,则原来的字段就会失效。因此建议实现上单独模块来存储获取凭据信息。
另外鉴于网络传输和网络时钟等影响,因此如果expires_in 时间过短时候,强制刷新accesstoken即可
如果遇到了全局返回错误码:30002的时候也需要刷新accesstoken
# 获取token凭证:注入参数
与方式一有两处不同的地方:第一、每次获取的凭证都是强制刷新的凭证。相当于方式一中的refresh字段为1;第二、请求凭证时可以携带传入的参数。如果使用方式二获取凭证,请注意请求其他接口时传递的请求参数与方式一的区别。
注意:小微体系其他服务方签发的token,token凭证中已经注入了相关参数
请求地址: https://{BASE_URL}/xwcloudapi/auth_get_token BASE_URL详见基础说明章节中的基础规则。
请求方法: post
请求参数:
field name | field type | required | Desc |
---|---|---|---|
pid | int | Yes | 小微硬件平台注册获取的AppUin |
timestamp | Int | Yes | 当时的Unix时间戳timestamp,秒级时间戳 |
code | String | Yes | 计算方法为sha256(signkey)或者md5(signkey),其中md5加密方式待废弃,推荐使用sha256。 signkey=secretkey+str(pid)+str(timestamp) |
base_info | Json object | Optional | 请求其他接口时的基础参数,base_info详细描述请见基础说明章节。注意:不需要传递base_info中的query_id、auth字段。 |
请求示例:
比如pid为2011189 当前timestamp为 1575851427 分配secret_key:为iurwbrydfksaflhcc
计算code为:
sha256("iurwbrydfksaflhcc20111891575851427") = 412772014d96df740bbd7ad1260524eedad4ef645e3181b8b2b51ce96f41b4cb
因此请求是:
{
"pid": 2011189,
"timestamp": 1575851427,
"code":"412772014d96df740bbd7ad1260524eedad4ef645e3181b8b2b51ce96f41b4cb",
"base_info": {
"device_info": {
"pid": 2011189,
"channel_id": 1,
"SN": "KADSJFLJSDLAJFLSADJFLJFLJDSALFJLFD"
},
"user_info": {
"uid": "293399333",
"uname": "I'm test"
}
}
}
返回示例:
{
"code": 0,
"msg": "OK",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYXNlX2luZm8iOiJ7XCJjb2RlXCI6XCIwN2E0YTZlNTRlMDUwMjRlYmQ0MTMzMzM5Y2M3OTAzMFwiLFwicGlkXCI6ODIzOTIzNDc4LFwidGltZXN0YW1wXCI6XCIxNTk4NTk5NzA1XCJ9XG4iLCJleHAiOjE1OTg2MDY5MDV9.nBuDFO7CWfg9KLognHIy10WFIorzuMBBRNh_F8gSXY",
"expires_in": 7200
}
}
返回参数:
field name | field type | Desc |
---|---|---|
code | int | 返回错误码 0成功非零失败 |
msg | string | |
data.access_toke | 安全鉴权字段 用于后续请求接口鉴权,填入请求参数的auth字段 | |
data.expires_in | int | 过期时间 单位s |
注意: 请求获取凭证时携带base_info中的device_info与user_info字段,auth_get_token接口不会对device_info与user_info字段做参数校验,在访问其他接口进行校验凭证时,会校验base_info的device_info与user_info字段。如果请求其他接口返回参数校验相关错误(错误码为20002、20003、20004),请检查获取凭证时base_info中user_info与device_info相关参数是否正确。
说明: 如果请求其他接口遇到了全局返回错误码30002的时候需要重新获取凭证。