Android应用保存sap.AuthProxy.CertificateFromStore至localStorage问题求助
解决sap.AuthProxy.CertificateFromStore实例无法完整保存到localStorage的问题
问题原因
localStorage仅支持存储字符串,直接存储CertificateFromStore实例时,浏览器会自动调用JSON.stringify()序列化对象,但该方法仅保留对象的可枚举自有属性(即你看到的{ SYSTEM : SOURCE }),实例的原型链、类标识、内部方法/状态等关键信息都会丢失。
解决方案
1. 优先使用SDK自带的序列化/反序列化方法
SAP AuthProxy通常会为核心对象提供官方序列化工具,检查CertificateFromStore实例是否包含toJSON()方法,或sap.AuthProxy是否提供fromJSON()这类静态方法:
// 保存时 const serializedCert = JSON.stringify(this.factory.clientCert.toJSON()); localStorage.setItem('clientCert', serializedCert); // 读取并重建实例时 const rawData = localStorage.getItem('clientCert'); const certData = JSON.parse(rawData); this.factory.clientCert = sap.AuthProxy.CertificateFromStore.fromJSON(certData);
2. 手动重建实例(无官方方法时)
如果SDK未提供序列化工具,可通过以下方式手动恢复实例:
// 保存到localStorage const certInfo = { properties: { ...this.factory.clientCert }, type: 'CertificateFromStore' }; localStorage.setItem('clientCert', JSON.stringify(certInfo)); // 从localStorage读取并重建 const savedCert = JSON.parse(localStorage.getItem('clientCert')); if (savedCert.type === 'CertificateFromStore') { this.factory.clientCert = new sap.AuthProxy.CertificateFromStore(); // 将保存的属性赋值给新实例 Object.assign(this.factory.clientCert, savedCert.properties); }
3. InAppBrowser传参的特殊处理
通过postMessage传递时,同样只能传递可序列化数据,接收端(InAppBrowser内的页面)需确保能访问sap.AuthProxy环境,再按上述方式重建实例:
// 发送端 const certInfo = { properties: { ...this.factory.clientCert }, type: 'CertificateFromStore' }; inAppBrowserRef.postMessage(JSON.stringify(certInfo)); // 接收端(InAppBrowser页面) window.addEventListener('message', (event) => { const savedCert = JSON.parse(event.data); if (savedCert.type === 'CertificateFromStore') { const clientCert = new sap.AuthProxy.CertificateFromStore(); Object.assign(clientCert, savedCert.properties); // 使用重建后的clientCert发起请求 } });
注意事项
CertificateFromStore实例可能依赖设备本地证书上下文,跨应用/环境传递后,重建的实例需重新验证可用性(比如重新触发证书选择流程)- 避免将敏感证书内容存储到localStorage,优先使用SDK提供的安全存储机制
内容的提问来源于stack exchange,提问作者Rafi Ben Zaken
相关产品推荐
相关产品推荐

