You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic 5 Cordova+Angular11集成Play Integrity API检测Root设备问询

针对Ionic 5 + Cordova + Angular 11集成Play Integrity API的解决方案

1. 必要权限与配置

Play Integrity API不需要额外的Android权限,但以下核心配置必须完成:

  • Google Cloud Console配置:
    • 启用Play Integrity API,生成专属API密钥。
    • 将你的Android应用(对应包名)与该Cloud项目关联绑定。
  • Play Console配置:
    • 在应用的「应用签名」页面确认签名证书已配置(Play Integrity依赖Play官方签名体系,debug签名无法正常调用API)。
    • 确保应用已上传至Play Console的测试/发布轨道(哪怕是内部测试轨道),未通过Play分发的应用调用API会直接返回验证失败。

2. 可用的Cordova插件

目前没有Google官方维护的Play Integrity Cordova插件,但社区有第三方资源可尝试:

  • cordova-plugin-play-integrity:社区维护的轻量插件,支持基础的token请求功能,需注意适配你的Cordova版本(建议Cordova Android 10及以上)。
  • 若插件兼容性不佳,自行封装自定义插件是更可靠的方案,可完全匹配你的技术栈需求。

3. 无现成插件时的原生桥接实现

如果找不到合适的第三方插件,可通过Cordova原生桥接直接调用Play Integrity API,具体步骤如下:

步骤1:编写Android原生代码(Java)

在Cordova项目的platforms/android/src/com/yourpackage/路径下创建自定义插件类(示例命名PlayIntegrityPlugin.java):

package com.yourpackage;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;

import com.google.android.play.core.integrity.IntegrityManager;
import com.google.android.play.core.integrity.IntegrityManagerFactory;
import com.google.android.play.core.integrity.IntegrityTokenRequest;
import com.google.android.play.core.integrity.IntegrityTokenResponse;
import com.google.android.play.core.tasks.Task;
import com.google.android.play.core.tasks.Tasks;

public class PlayIntegrityPlugin extends CordovaPlugin {

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("requestIntegrityToken".equals(action)) {
            String nonce = args.getString(0);
            this.requestIntegrityToken(nonce, callbackContext);
            return true;
        }
        return false;
    }

    private void requestIntegrityToken(String nonce, CallbackContext callbackContext) {
        cordova.getThreadPool().execute(() -> {
            try {
                IntegrityManager integrityManager = IntegrityManagerFactory.create(cordova.getActivity());
                IntegrityTokenRequest request = IntegrityTokenRequest.builder()
                        .setNonce(nonce)
                        .build();

                Task<IntegrityTokenResponse> task = integrityManager.requestIntegrityToken(request);
                IntegrityTokenResponse response = Tasks.await(task);
                callbackContext.success(response.token());
            } catch (Exception e) {
                callbackContext.error(e.getMessage());
            }
        });
    }
}

步骤2:配置插件映射

在自定义插件的plugin.xml中添加如下配置:

<plugin name="PlayIntegrityPlugin" version="1.0.0">
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="PlayIntegrityPlugin">
                <param name="android-package" value="com.yourpackage.PlayIntegrityPlugin"/>
            </feature>
        </config-file>
        <source-file src="src/android/PlayIntegrityPlugin.java" target-dir="src/com/yourpackage"/>
        <dependency id="com.google.android.play:integrity:1.1.0"/>
    </platform>
</plugin>

步骤3:在Angular服务中调用

创建play-integrity.service.ts封装调用逻辑:

import { Injectable } from '@angular/core';

declare var cordova: any;

@Injectable({ providedIn: 'root' })
export class PlayIntegrityService {
    requestIntegrityToken(nonce: string): Promise<string> {
        return new Promise((resolve, reject) => {
            cordova.exec(
                (token: string) => resolve(token),
                (error: string) => reject(error),
                'PlayIntegrityPlugin',
                'requestIntegrityToken',
                [nonce]
            );
        });
    }
}

在组件中使用该服务:

import { Component } from '@angular/core';
import { PlayIntegrityService } from './play-integrity.service';

@Component({ selector: 'app-root', template: `...` })
export class AppComponent {
    constructor(private playIntegrityService: PlayIntegrityService) {}

    async checkDeviceIntegrity() {
        // 建议从后端获取绑定用户会话的nonce,防止重放攻击
        const nonce = Math.random().toString(36).substring(2);
        try {
            const integrityToken = await this.playIntegrityService.requestIntegrityToken(nonce);
            // 将token与nonce一同发送至后端完成验证
            await this.sendTokenToBackend(integrityToken, nonce);
        } catch (error) {
            console.error('设备完整性检测失败:', error);
            // 处理验证失败逻辑,如限制功能访问
        }
    }

    private async sendTokenToBackend(token: string, nonce: string) {
        // 实现后端API调用逻辑,交由后端完成Google Play Integrity的token验证
    }
}

注意事项与最佳实践

  • 强制后端验证:Play Integrity返回的token必须在你的后端通过Google官方验证API解析,绝对不能在前端处理——前端环境不可信,无法保证验证结果的安全性。
  • Nonce安全策略:Nonce应是随机唯一值,最好由后端生成并与用户会话绑定,避免重放攻击。
  • 测试环境限制:Debug签名的应用无法正常调用API,必须使用Play Console的内部测试轨道,上传签名后的APK/App Bundle进行测试。
  • 错误处理覆盖:需处理各类异常场景,如网络异常、设备不支持Android 5.0+、应用未关联Play项目等。
  • 依赖版本匹配:确保Cordova Android版本≥10,Play Integrity SDK版本≥1.1.0,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Mustafa Shakaroun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:32:44