设备风险 SDK Harmony 接入

更新时间:
复制为 MD 格式

本文档介绍了设备风险 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

  1. 下载 Harmony SDK,并完成解压。SDK 为 Harmony 标准的.har 包。

  2. 将.har 文件拷贝到工程中存放 har 包的目录。建议参考鸿蒙官方文档放至 libs 目录下,在工程根目录的 oh-package.json5 添加认证包的版本依赖树管理。

  3. 修改项目工程中的 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)两个核心接口。完成下载配置后,按以下流程接入:

  1. 初始化(initWithOptions)

  2. 获取客户端 Token(getDeviceToken)

  3. 携带 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

    "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常见问题