# 安全相关

​ 为了保证接口调用的安全性,腾讯小微对接口调用做了一些调用限制,主要从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的时候需要重新获取凭证。