Пользовательский поставщик безопасного хранения Ionic v3 - с использованием CryptoJS - PullRequest
0 голосов
/ 28 ноября 2018

Как я могу использовать этот провайдер?Я написал кеш-сервис для моего приложения следующим образом.

cache-service.ts

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { SecureStorageProvider } from '../secure-storage/secure- 
storage';

@Injectable()
export class CacheServiceProvider {

    constructor(
    private secureStorage:SecureStorageProvider,
    ) {

    }

    getCache(key: string) {
    return new Promise((resolve, reject) => {
      this.secureStorage.get(key).then((val) => {
        console.error(key,"Value is found......", val);
        if (val != undefined) {
          if(val===false){
            return false;
          }else{
          resolve(val);
          }
        } else {
          reject({'msg':'value not found'});
        }
      });
     })
    }

    setCache(key: string, value: any) {
      this.secureStorage.set(key,value);
    }

    removeCache(key: string) {
      this.secureStorage.remove(key);
    }

    clearCache() {
      this.secureStorage.clear();
    }
}

secure-storage.ts:

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import CryptoJS from 'crypto-js';

@Injectable()
export class SecureStorageProvider {

    secret: string = '';
    localData: Object = {};
    storekey: string = "secretdata";

    constructor(
        private storage: Storage
    ) { }

    initStorage(secret) {
        this.secret = secret;
       return this.storage.ready()
           .then(() =>
              { return this.storage.get(this.storekey)
                   .then(data => {

                        this.localData={};
                        console.log("THIS IS WHERE IT ALL BEGINS",secret);
                        if (data != null) {
                           this.localData = this.decrypt(data, 
    this.secret);
                           return true
                       } else return false
                   })})
    }

    encrypt(data, key) {
       return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString();
    }

    decrypt(data, key) {
       let bytes = CryptoJS.AES.decrypt(data, key);
       return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
    }

    setOnly(key, data) {
       this.localData[key] = data;
       return Promise.resolve(true);
    }

    get(key) {
       if (this.localData[key])
           return Promise.resolve(this.localData[key])
       else return Promise.resolve(null);
    }

    changeSecret(newsecret) {
       this.secret = newsecret;
       return this.storage.ready()
           .then(() => {
               return this.storage.set(this.storekey,
                   this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           })
    }

    set(key, data) {
       this.setOnly(key, data);

       return this.storage.ready()
           .then(() => {
               return this.storage.set(this.storekey,
                   this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           })
    }

    remove(key:any){

       if (this.localData[key]){
           delete this.localData[key]; 
           this.storage.set(this.storekey,
           this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           return Promise.resolve(this.localData[key]);
       }else{
           return Promise.resolve(null);
       }
    }

    clear()
    {
        this.storage.clear();
    }
}

Над кодом работает нормально в Android, но не в iOS.

Для Android он работает нормально, и мы получаем значение для каждого установленного ключа.Но для iOS я не могу отладить, почему он не работает.Я пробовал симулятор, а также устройство.Он устанавливает значение, но никогда не читает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...