设备风险 SDK Harmony 接入

更新时间:
复制 MD 格式

本文档介绍了设备风险 SDK(Harmony)的接入流程。

使用须知

设备风险 SDK 需在 HarmonyOS NEXT 5.0 及以上(对应 API 12+)系统上运行。

Harmony SDK 使用限制如下:

  • 支持 HarmonyOS NEXT 5.0 及以上系统版本的移动智能设备(手机或 Pad)接入。

  • 支持 arm64-v8a 架构。

前提条件

为落实集成第三方 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,并完成解压。SDK 为 Harmony 标准的.har 包。

  • 单架构的 SO 文件在 3.0 M 左右。

  • 设备风险识别 SDK 内置了较强的代码保护和数据加密机制,因此体积会相对变大。

  • 在项目工程中的 oh-package.json5 文件,在 dependencies 中中添加以下依赖关系:

{
  "dependencies": {
    "aliyundevice": "file:../libs/HarmonyOS-AliyunDevice-xxx.har"
  }
}

接口混淆配置(重要)

为避免接口被混淆而造成功能异常,请查看.har 包中 obfuscation.txt 文件中的配置,请勿移除该文件。若在部分版本编译器中发现混淆配置无法合并,导致无法正常接入,需要在应用的主工程打包添加 har 包中的混淆配置文件obfuscation-rules.txt,并将混淆配置添加到当前工程中。

调用 SDK

完成上述配置后,按以下三个步骤完成客户端接入:

  • 初始化(initWithOptions)

  • 获取客户端 Token(getDeviceToken)

  • 携带 Token 请求服务端

1. 初始化(initWithOptions)

该函数用于完成 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 管理申请获取。

    • securityInitListener:初始化回调监听接口,可在回调中判断初始化是否成功,默认可以为 null。code 字段取值范围参考"状态返回值"。

    • options:信息采集可选项,默认为 null。可选参数如下。

      字段名

      说明

      示例

      IPv6

      是否使用 IPv6 域名上报设备信息。0(默认):使用 IPv4 域名。1:使用 IPv6 域名。

      "0"

      CustomUrl

      设置数据上报服务器域名。指定站点上报时使用,默认不需要设置。

      "https://cloudauth-device.aliyuncs.com"

      CustomHost

      设置数据上报服务器 host。需与 CustomUrl 配对使用,默认和 CustomUrl 一起不需要设置。

      "cloudauth-device.aliyuncs.com"

      CustomUrl和CustomHost参数说明

      指定站点上报,需要设置 CustomUrl 和 CustomHost 为指定地域,默认情况不需要设置。

      地域

      地址

      国内(默认)

      CustomUrl:https://cloudauth-device.aliyuncs.com
      CustomHost:cloudauth-device.aliyuncs.com

  • 调用示例

@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);

2. 获取客户端 Token(getDeviceToken)

获取客户端 token 并上报到业务服务器,后续通过服务器端获取设备风险信息。

重要

确保initWithOptions接口和getDeviceToken接口调用时间间隔 2 秒以上,或者在初始化成功回调后调用。

调用getDeviceToken时建议传入 bizId,可以将本次 token 和业务唯一 ID 绑定,后在服务端查询结果时将 ID 一起传入,并确保客户端传入 bizId 和服务端传入 ID 一致,可校验 Token 被篡改的风险。

  • 函数原型

export class SecurityToken {
   // 结果 Code
  public code:number = 0;

  // SDK 返回的 deviceToken
  public token:string = "";
}

// 推荐传入 bizId
public getDeviceToken(bizId?: string): SecurityToken
重要

token 字符串在网络环境良好的场景下,长度为 600 字节左右;在网络环境较差的场景下,返回的长度在 2 K 左右。

如果业务上出现了大量的长 token:

首先,请确保客户端的网络是畅通的;

其次,确保 SDK 的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);
}

3. 携带 Token 请求服务端

成功获取 deviceToken 后,将 deviceToken 作为参数传至业务服务端。由服务端调用阿里云设备风险识别 API 接口,传入 deviceToken 查询并校验设备风险信息。

状态返回值

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 版本不匹配。

完整代码示例

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,在 App 生命周期中只需要调用 1 次
            SecurityDevice.getInstance().initWithOptions(getContext(), this.ALIYUN_APPKEY, null, null);

            // 不建议立即同步调用getDeviceToken,初始化未完成就调用会返回降级的 deviceToken
            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常见问题。