本文档介绍了设备风险 SDK(HarmonyOS 系统)的接入流程。通过在 HarmonyOS 应用中集成设备风险 SDK,您可以采集设备指纹信息,用于后续的业务风险识别场景。
前提条件
-
设备风险 SDK 需要在 Harmony Next(0.0.71)及以上版本的系统运行,API 版本最低支持 12。
-
不支持模拟器模式调试。
-
仅支持开启字节码打包方案。
为帮助落实针对您产品集成第三方 SDK 情况所应履行的隐私合规义务,降低隐私违规风险,进而实现您产品合规运营的业务目标,请您务必确保选用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请您务必仔细了解个人信息处理规定及《风险识别 SDK 隐私权政策》,并按照《SDK 合规使用说明》进行接入。
权限说明
为增强风险识别的识别效果,当前 SDK 需要以下权限:
|
权限 |
是否必须 |
说明 |
|
ohos.permission.INTERNET |
是 |
联网权限。SDK 需要联网才能使用。 |
|
ohos.permission.GET_NETWORK_INFO |
是 |
网络状态确认。SDK 可以根据网络状态提供更好的服务。 |
|
ohos.permission.STORE_PERSISTENT_DATA |
否(推荐赋予) |
允许应用存储持久化的数据。SDK 可以增加设备指纹稳定性。 |
|
ohos.permission.DISTRIBUTED_DATASYNC |
否(推荐赋予) |
多设备协同。SDK 可以检测多设备状态,增强安全效果。 |
|
ohos.permission.APP_TRACKING_CONSENT |
否(推荐赋予) |
获取广告标识符权限。SDK 获取 IDFA 信息,增强设备 ID 稳定性。 |
下载和配置 Harmony SDK
-
下载 Harmony SDK,并完成解压。SDK 为 Harmony 标准的.har 包。
-
将.har 文件拷贝到工程中存放 har 包的目录。建议参考鸿蒙官方文档放至 libs 目录下,在工程根目录的 oh-package.json5 添加认证包的版本依赖树管理。
-
修改项目工程中的 oh-package.json5 文件,在 dependencies 中添加 AliyunDevice 依赖包,示例如下:
{ "dependencies": { "aliyundevice": "file:../libs/HarmonyOS-AliyunDevice-xxx.har" } }
接口混淆配置
为避免接口被混淆而造成功能异常,请查看.har 包中 obfuscation.txt 文件中的配置,请勿移除该文件。若在部分版本编译器中发现混淆配置无法合并,导致无法正常接入,需要在应用的主工程打包添加 har 包中的混淆配置文件obfuscation-rules.txt,并将混淆配置添加到当前工程中。
接口说明
Harmony SDK 包含初始化(initWithOptions)和获取 Token(getDeviceToken)两个核心接口。完成下载配置后,按以下流程接入:
-
初始化(initWithOptions)
-
获取客户端 Token(getDeviceToken)
-
携带 Token 请求服务端
初始化 SDK
SDK 内部初始化,在 App 启动的时候,您需要尽可能早地调用该函数。
-
函数原型
export class SecurityInitListener { // code 表示接口调用状态码 onInitFinish(code: number): void {} } public initWithOptions(ctx: Context, userAppKey: string, options: Map<string, string>, securityInitListener: SecurityInitListener): void; -
参数
ctx:当前 Ability 的 Context。
userAppKey:用于标识用户身份,可在阿里云控制台的设备 App 管理申请获取。
options:信息采集可选项,默认可以为 null。可选参数如下。
字段名
说明
示例
IPv6
是否使用 IPv6 域名上报设备信息。
-
0(默认):使用 IPv4 域名。
-
1:使用 IPv6 域名。
"1"
CustomUrl
设置数据上报服务器域名。
说明指定站点上报,需要设置 CustomUrl 和 CustomHost 为国内指定地域,默认情况不需要设置。
"https://cloudauth-device.aliyuncs.com"
CustomHost
设置数据上报服务器 host。
"cloudauth-device.aliyuncs.com"
securityInitListener:初始化回调监听接口,可在回调中判断初始化是否成功,默认可以传入 null。其中,code 字段取值范围可参考"状态返回值"。
public interface SecurityInitListener { // code 表示接口调用状态码 void onInitFinish(int code); } -
-
返回值
无。
-
调用示例
@State USER_PRODUCT_KEY: string = "123e4567e89b12d3a45642661417****"; let options: Map<string, string> = new Map<string, string>(); options.set("IPv6", "0"); // 设置为 IPv4 // 设置自定义的数据上报地域 // options.set("CustomUrl", "xxx"); 设置上报站点 Url // options.set("CustomHost", "xxx"); 设置上报站点 Host SecurityDevice.getInstance().initWithOptions(getContext(), this.USER_PRODUCT_KEY, options, null);
获取客户端 Token
获取客户端 Token,并上报到业务自己的服务器,后续通过服务器端设备风险识别 API 获取设备风险信息。
-
确保
initWithOptions接口和getDeviceToken接口调用时间间隔 2 秒以上。 -
调用
getDeviceToken时建议传入 bizId,可以将本次 Token 和业务唯一 ID 绑定,后续在服务端查询结果时将 ID 一起传入,并确保客户端传入的 bizId 和服务端传入的 ID 一致,可校验 Token 被篡改的风险。 -
建议在 APP 非主线程上调用 getDeviceToken 接口,以避免接口调用耗时可能导致的崩溃。
-
多线程场景下初始化接口需要在主线程内调用,且应用的生命周期内只需要调用 1 次。
-
函数原型
export class SecurityToken { /** * 结果 Code, 含义参照 SecurityCode */ public code:number = 0; /** * SDK 返回的 deviceToken */ public token:string = ""; } // 推荐传入 bizId public getDeviceToken(bizId?: string): SecurityToken -
参数
bizId:客户的业务 ID,可用于关联业务 ID 和 Token。默认情况可以不传。
-
返回值
SecurityToken 类型,定义如下:
code:返回接口调用状态码,可用于判断接口调用是否成功。code 字段取值范围可参考"状态返回值"。
token:返回 Token 字符串信息,可用于业务后续查询阿里云设备风险识别接口。
重要-
Token 字符串在网络环境良好的场景下,长度为 600 字节左右;在网络环境较差的场景下,返回的长度在 2.5K 左右,并且带有特殊标识:
-
国内:有网"Tkxxxx"、弱网"UFxxxx"。
-
-
如果业务上出现了大量的长 Token,请确保客户端的网络是畅通的,并确保 initWithOptions 接口和 getDeviceToken 接口调用间隔在 2 秒以上。
-
-
调用示例
// 传入 bizId 示例,bizId 为客户的业务 ID,可以选择是否传入。 let bizId = "1234567890abcdef1234567890ab****"; let tokenObj: SecurityToken = SecurityDevice.getInstance().getDeviceToken(bizId); if (tokenObj.code == SecurityCode.SC_SUCCESS) { console.log("Aliyun Token: " + tokenObj.token); } else { console.log("Aliyun Code: " + tokenObj.code); }
状态返回值
|
SecurityCode |
Code |
备注 |
|
SC_SUCCESS |
10000 |
SDK 信息采集成功。 |
|
SC_NOT_INIT |
10001 |
SDK 未信息采集。 |
|
SC_NOT_PERMISSION |
10002 |
SDK 需要的 Harmony 基础权限未完全授权。 |
|
SC_UNKNOWN_ERROR |
10003 |
系统未知错误。 |
|
SC_NETWORK_ERROR |
10004 |
网络错误。 |
|
SC_NETWORK_ERROR_EMPTY |
10005 |
网络错误,返回内容为空串。 |
|
SC_NETWORK_ERROR_INVALID |
10006 |
网络返回的格式非法。 |
|
SC_PARSE_SRV_CFG_ERROR |
10007 |
服务端配置解析失败。 |
|
SC_NETWORK_RET_CODE_ERROR |
10008 |
网关返回失败。 |
|
SC_APPKEY_EMPTY |
10009 |
AppKey 为空。 |
|
SC_PARAMS_ERROR |
10010 |
其他参数错误。 |
|
SC_FGKEY_ERROR |
10011 |
密钥计算错误。 |
|
SC_APPKEY_ERROR |
10012 |
SDK 版本和 AppKey 版本不匹配。 |
示例代码
初始化设备风险 SDK,initWithOptions 接口需要在 APP 启动时尽可能早地调用。
其中,参数 ALIYUN_APPKEY 用于标识用户身份,可在阿里云控制台的设备 App 管理申请获取。
SecurityDevice.getInstance().initWithOptions(getContext(),
this.ALIYUN_APPKEY, null, null);
在业务需要风险识别的场景下(如注册、活动推广等)获取客户端 Token 并上报到业务的服务器端。确保 initWithOptions 和 getDeviceToken 接口的调用间隔在 2 秒以上。
从 SDK 2.0.0 版本开始,getDeviceToken改为同步调用,旧版异步代码需调整。
let tokenObj: SecurityToken = SecurityDevice.getInstance().getDeviceToken();
if (tokenObj.code == SecurityCode.SC_SUCCESS) {
console.log("Aliyun Token: " + tokenObj.token);
} else {
console.log("Aliyun Code: " + tokenObj.code);
}
完整代码示例:
import { SecurityCode, SecurityToken, SecurityDevice } from 'aliyundevice';
@Entry
@Component
struct Index {
@State message: string = 'Aliyun Device';
@State ALIYUN_APPKEY: string = "XXX";
build() {
Row() {
Column() {
Button(this.message)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.onClick((event: ClickEvent) => {
// 初始化 SDK
SecurityDevice.getInstance().initWithOptions(getContext(), this.ALIYUN_APPKEY, null, null);
// 延时 2 秒获取 Token
setTimeout(() => {
let tokenObj: SecurityToken = SecurityDevice.getInstance().getDeviceToken();
if (tokenObj.code == SecurityCode.SC_SUCCESS) {
console.log("Aliyun Token: " + tokenObj.token);
} else {
console.log("Aliyun Code: " + tokenObj.code);
}
}, 2000);
})
.margin({ top: 10 })
}
.width('100%')
}
.height('100%')
}
}
调用风险识别 API 接口
将 deviceToken 与其他参数,参考服务端API接口接入,请求风险识别 API 接口进行识别。
常见问题
关于设备风控 SDK 的常见问题,请参见SDK常见问题。