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
相关产品推荐
相关产品推荐

