如何在React Native安卓应用中集成Google Play Integrity API?
集成Google Play Integrity API到React Native安卓应用
1. 添加安卓依赖
在安卓项目的app/build.gradle文件中,引入Play Integrity库:
dependencies { // 保留原有依赖,新增以下行 implementation "com.google.android.play:integrity:1.1.0" }
2. 封装原生调用模块
React Native无官方Play Integrity封装,需自行编写原生模块:
2.1 创建模块类
在android/app/src/main/java/com/[你的应用包名]/路径下,新建PlayIntegrityModule.java:
package com.[你的应用包名]; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Promise; 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 PlayIntegrityModule extends ReactContextBaseJavaModule { private final IntegrityManager integrityManager; public PlayIntegrityModule(ReactApplicationContext reactContext) { super(reactContext); integrityManager = IntegrityManagerFactory.create(reactContext); } @Override public String getName() { return "PlayIntegrity"; } @ReactMethod public void requestIntegrityToken(String nonce, Promise promise) { try { IntegrityTokenRequest request = IntegrityTokenRequest.builder() .setNonce(nonce) .setCloudProjectNumber([你的Google Cloud项目编号]) .build(); Task<IntegrityTokenResponse> task = integrityManager.requestIntegrityToken(request); IntegrityTokenResponse response = Tasks.await(task); promise.resolve(response.token()); } catch (Exception e) { promise.reject("PLAY_INTEGRITY_ERROR", e.getMessage()); } } }
2.2 注册模块包
同路径下新建PlayIntegrityPackage.java:
package com.[你的应用包名]; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class PlayIntegrityPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new PlayIntegrityModule(reactContext)); return modules; } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
2.3 接入到应用主类
修改MainApplication.java的getPackages方法:
@Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); // 添加以下行注册模块 packages.add(new PlayIntegrityPackage()); return packages; }
3. React Native端调用
创建工具文件PlayIntegrity.js:
import { NativeModules } from 'react-native'; const { PlayIntegrity } = NativeModules; export const requestIntegrityToken = async (nonce) => { try { const token = await PlayIntegrity.requestIntegrityToken(nonce); // 将token发送至后端进行验证,切勿在前端处理验证逻辑 return token; } catch (error) { console.error('获取完整性令牌失败:', error); throw error; } };
4. 后端验证令牌
拿到前端传回的令牌后,在后端调用Google的验证接口(以Node.js为例):
const { google } = require('googleapis'); async function verifyIntegrityToken(token) { const client = await google.auth.getClient({ scopes: ['https://www.googleapis.com/auth/playintegrity'], }); const response = await google.playintegrity({ version: 'v1', auth: client, }).v1.decodeIntegrityToken({ packageName: '[你的应用包名]', requestBody: { integrityToken: token, }, }); return response.data; }
关键注意点
- 替换代码中
[你的应用包名]、[你的Google Cloud项目编号]为实际值 - Nonce需为随机生成的唯一字符串,用于防范重放攻击
- 必须使用Google Play签名的APK/App Bundle测试,本地调试包无法获取有效令牌
内容的提问来源于stack exchange,提问作者GaboMndz
相关产品推荐
相关产品推荐

