1 代理接入#

代理服务器主要任务是接收 smsdk 请求数据,按照业务要求是否需要解密设备数据,将数据透传给数美设备指纹服务器,然后将设备指纹服务响应数据透传给 smsdk。

1.1 构造请求参数#

  1. 请求方式 POST

  2. 请求域名:代理服务器需要根据业务机房区域请求对应数美设备指纹服务器

    设备指纹请求Android/iOS
    国内http://fp-proxy.fengkongcloud.com/deviceprofile/v4
    东南亚http://fp-sa-proxy.fengkongcloud.com/deviceprofile/v4
    欧美http://fp-na-proxy.fengkongcloud.com/deviceprofile/v4
    法兰克福http://api-device-eur.fengkongcloud.com/deviceprofile/v4
    云配请求Android/iOS
    国内http://fp-proxy.fengkongcloud.com/v3/cloudconf
    东南亚http://fp-sa-proxy.fengkongcloud.com/v3/cloudconf
    欧美http://fp-na-proxy.fengkongcloud.com/v3/cloudconf
    法兰克福http://api-device-eur.fengkongcloud.com/v3/cloudconf
  3. 请求 Header:将 smsdk 上传的真实 IP、X-Forwarded-For、User-Agent 放置在 HTTP Header 中

    参数来源
    X-Real-IP客户端真实 IP,避免使用中转服务器的 IP
    X-Forwarded-For客户端请求 X-Forwarded-For,将代理服务 IP 放置末端
    User-Agent客户端真实 User-Agent,避免使用中转服务器的 UA

    注意:SDK发出的请求,头部信息中Content-Type为application/octet-stream

  4. 请求 Body:即 smsdk 上报的 Body 数据

1.2 处理器响应#

  1. 成功数据:code 为 1100

    // 示例1
    {
    "code": 1100,
    "detail": {
    "deviceId": "H7AGEniCL9dZficNw7ppO4Emp7S4xFKhz+WXukRNiKI3s0Oto9Hq5Zzev4oUy2NQtmlT9Xkdj4tOrO5brIMMbQ=="
    },
    "requestId": "d8ec50b3835d84e4483f49be8cec7e5b"
    }
    // 示例2
    {
    "code":1100,
    "detail":{
    "c":50,
    "deviceId":"d+l72wI2iir+FcnCyCQf8WgSOQcHiCbYcUaGF4QxY/x7nYmJzhMRRqdrTisaphGMTv9tfzrHxFn11YTAapc/og==",
    "t":1440
    },
    "requestId":"77bba96c0dead4bb53c2a1ee4f3122e0"
    }

    直接将此类响应透传给 smsdk 即可

  2. 失败数据:code 非 1100,如

    {
    "code":1902,
    "requestId":"6dc6a15f940b9a3e50adb9c29f38bbdc"
    }

    直接将此类响应透传给 smsdk 即可,返回码及处理说明

    code说明
    1100成功,不需要处理
    1901QPS 超限,通知数美客服,调整 QPS 限制
    1902smsdk 参数不合法,需要在端上检查 smsdk 配置是否正确,或提供对应 requestId 联系数美技术排查
    1903服务失败,需要联系数美技术排查问题,需要提供对应 requestId
    9101无权限操作,联系数美客户确认是否开通相应服务
  3. 无响应或响应超时:代理服务请求数美服务器出现连接失败,如握手失败、超时等问题时,可将下列内容传给客户端

    {
    "code":1903,
    "message":"错误原因"
    }

    客户端 SDK 遇到 1903 错误码后,会进行重试。

1.3 解密设备数据#

代理服务器接收到 smsdk 上报数据,需要根据 os 字段判断平台,然后使用 设备指纹解密工具 + 对应平台秘钥 进行解密,示例数据

{
"organization": "ORGANIZATION",
"os": "android",
"appId": "default",
"encode": 2,
"compress": 3,
"data": "ENCRYPT-DATA",
"tn": "TN",
"ep": "EP"
}

设备指纹解密工具,默认提供 Java、Go 版本,如果需要其它语言 SDK,请联系数美工作人员,具体使用方式参考设备指纹解密工具 API 文档,以下是 Java 版本工具 SmFpCrypto.decrypt 使用方法

// postData 是 smsdk 上报数据,格式见上文 ”示例数据“
JSONObject postDataJson = new JSONObject(postData);
// 1 获取平台
String os = postDataJson.optString("os", "");
// 2 根据平台获取对应 RSA 私钥
String privateKey;
if (os.equals("android")) {
privateKey = new String(Files.readAllBytes(Paths.get("YOUR-Android-PRIVATE-KEY-PATH")));
} else if (os.equals("ios")) {
privateKey = new String(Files.readAllBytes(Paths.get("YOUR-iOS-PRIVATE-KEY-PATH")));
} else if (os.equals("harmony")) {
privateKey = new String(Files.readAllBytes(Paths.get("YOUR-Harmony-PRIVATE-KEY-PATH")));
} else if (!os.isEmpty()) {
System.out.println("其他平台暂不支持");
return null;
} else {
System.out.println("postData 格式错误");
return null;
}
// 3 调用解密工具解密,decData 解密数据,格式为 json 字符串,数据内容参考 ”设备指纹采集列表“ 文档
String decData = SmFpCrypto.decrypt(postData, privateKey, "");

2 设备指纹标识解密#

boxId、boxData 需要解密才可以当做设备标识。

boxId 解密工具默认提供 Java、Go 版本,禁止将解密工具放到终端(如 Android 端、iOS 端)进行解密,如果需要其它语言 SDK,请联系数美工作人员,具体使用方式参考 boxId 解密工具 API 文档,以下是 Java 版本工具 BoxIdTranslator.outputSmid 使用方法

final String boxId = "Bxxxxxx=="; // boxId
String smid = null;
try {
// YOUR-KEY 为 boxId 解密工具秘钥
smid = BoxIdTranslator.outputSmid(boxId, YOUR-KEY);
} catch (Exception e) {
// boxId 非法,更具日志提示修改
e.printStackTrace();
}

boxData 解密需要使用天象服务,需要联系数美工作人员开通相关服务。开通服务后,根据天象使用手册请求设备风险标签,返回数据中包含明文设备指纹标识。

如果天象数据中没有设备指纹标签,需要给数美工作人员提供 boxData 和 requestId 进行问题排查。

在线咨询