2017-10-02 7 views
5

J'essaie d'initialiser le plug-in de stockage sécurisé. Lorsque cela échoue, cela signifie que l'utilisateur n'a pas de jeu de verrous sécurisé. Utilisation de la page GitHub je suis en train de recréer l'échantillon fourni:Stockage sécurisé ionique - Demander à l'utilisateur de définir un écran de verrouillage

var ss; 
var _init = function() { 
    ss = new cordova.plugins.SecureStorage(
     function() { 
      console.log('OK'); 
     }, 
     function() { 
      navigator.notification.alert(
       'Please enable the screen lock on your device. This app cannot operate securely without it.', 
       function() { 
        ss.secureDevice(
         function() { 
          _init(); 
         }, 
         function() { 
          _init(); 
         } 
        ); 
       }, 
       'Screen lock is disabled' 
      ); 
     }, 
     'my_app'); 
}; 
_init(); 

Ceci est ma tentative:

private createSecureStorage() { 
    this.secureStorageAPI.create(this.storeName).then( 
     (storage: SecureStorageObject) => { 
      this.secureStorage = storage; 
    }).catch( 
     (error) => { 
      this.dialogs.alert('Please enable the screen lock on your device. This app cannot operate securely without it.').then( 
       () => { 
       // Alert Dismissed, should open the secure lockscreen settings here 
        this.secureStorage.secureDevice().then( 
        () => { 
          // Try again 
          this.createSecureStorage(); 
         } 
       ).catch(() => { 
        // Try again 
        this.createSecureStorage(); 
        }) 
       }) 
     }); 
    } 

Le problème que je vais avoir est que lorsque l'appel secureStorageApi.create échoue, secureStorage sera indéfini, donc je ne peux pas l'utiliser pour appeler l'appel secureDevice().

Toute aide serait grandement appréciée.

+0

Personne ne peut aider avec celui-ci? Je pense que cela pourrait être une conception défectueuse parce que vous avez besoin de l'objet SecureStorage pour appeler secureDevice() – Juxture

Répondre

6

Pour tout le monde qui a besoin que cela fonctionne modifier en ce moment:

node_modules \ @ \-stockage sécurisé ionique natif \ index.js

Code de travail

Il devrait ressembler comme ceci:

var __extends = (this && this.__extends) || (function() { 
    var extendStatics = Object.setPrototypeOf || 
     ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 
     function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; 
    return function (d, b) { 
     extendStatics(d, b); 
     function __() { this.constructor = d; } 
     d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 
    }; 
})(); 
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 
    return c > 3 && r && Object.defineProperty(target, key, r), r; 
}; 
var __metadata = (this && this.__metadata) || function (k, v) { 
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 
}; 
import { Injectable } from '@angular/core'; 
import { CordovaInstance, Plugin, CordovaCheck, IonicNativePlugin } from '@ionic-native/core'; 
/** 
* @hidden 
*/ 
var SecureStorageObject = (function() { 
    function SecureStorageObject(_objectInstance) { 
     this._objectInstance = _objectInstance; 
    } 
    /** 
    * Gets a stored item 
    * @param key {string} 
    * @returns {Promise<string>} 
    */ 
    SecureStorageObject.prototype.get = function (key) { return; }; 
    /** 
    * Stores a value 
    * @param key {string} 
    * @param value {string} 
    * @returns {Promise<any>} 
    */ 
    SecureStorageObject.prototype.set = function (key, value) { return; }; 
    /** 
    * Removes a single stored item 
    * @param key {string} 
    * @returns {Promise<string>} returns a promise that resolves with the key that was removed 
    */ 
    SecureStorageObject.prototype.remove = function (key) { return; }; 
    /** 
    * Get all references from the storage. 
    * @returns {Promise<string[]>} returns a promise that resolves with array of keys storage 
    */ 
    SecureStorageObject.prototype.keys = function() { return; }; 
    /** 
    * Clear all references from the storage. 
    * @returns {Promise<any>} 
    */ 
    SecureStorageObject.prototype.clear = function() { return; }; 
    return SecureStorageObject; 
}()); 
/** 
* @hidden 
*/ 
var SecureDeviceObject = (function() { 
    function SecureDeviceObject(_objectInstance) { 
     this._objectInstance = _objectInstance; 
    } 

    /** 
     * Brings up the screen-lock settings 
     * @returns {Promise<any>} 
     */ 
    SecureStorageObject.prototype.secureDevice = function() { return; }; 
    return SecureDeviceObject; 
}()); 
export { SecureStorageObject, SecureDeviceObject }; 
__decorate([ 
    CordovaInstance({ 
     callbackOrder: 'reverse' 
    }), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", [String]), 
    __metadata("design:returntype", Promise) 
], SecureStorageObject.prototype, "get", null); 
__decorate([ 
    CordovaInstance({ 
     callbackOrder: 'reverse' 
    }), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", [String, String]), 
    __metadata("design:returntype", Promise) 
], SecureStorageObject.prototype, "set", null); 
__decorate([ 
    CordovaInstance({ 
     callbackOrder: 'reverse' 
    }), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", [String]), 
    __metadata("design:returntype", Promise) 
], SecureStorageObject.prototype, "remove", null); 
__decorate([ 
    CordovaInstance({ 
     callbackOrder: 'reverse' 
    }), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", []), 
    __metadata("design:returntype", Promise) 
], SecureStorageObject.prototype, "keys", null); 
__decorate([ 
    CordovaInstance({ 
     callbackOrder: 'reverse' 
    }), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", []), 
    __metadata("design:returntype", Promise) 
], SecureStorageObject.prototype, "clear", null); 
__decorate([ 
    CordovaInstance(), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", []), 
    __metadata("design:returntype", Promise) 
], SecureDeviceObject.prototype, "secureDevice", null); 
/** 
* @name Secure Storage 
* @description 
* This plugin gets, sets and removes key,value pairs from a device's secure storage. 
* 
* Requires Cordova plugin: `cordova-plugin-secure-storage`. For more info, please see the [Cordova Secure Storage docs](https://github.com/Crypho/cordova-plugin-secure-storage). 
* 
* The browser platform is supported as a mock only. Key/values are stored unencrypted in localStorage. 
* 
* @usage 
* 
* ```typescript 
* import { SecureStorage, SecureStorageObject } from '@ionic-native/secure-storage'; 
* 
* constructor(private secureStorage: SecureStorage) { } 
* 
* ... 
* 
* this.secureStorage.create('my_store_name') 
* .then((storage: SecureStorageObject) => { 
* 
*  storage.get('key') 
*  .then(
*   data => console.log(data), 
*   error => console.log(error) 
*  ); 
* 
*  storage.set('key', 'value') 
*  .then(
*   data => console.log(data), 
*   error => console.log(error) 
*  ); 
* 
*  storage.remove('key') 
*  .then(
*   data => console.log(data), 
*   error => console.log(error) 
*  ); 
* 
* }); 
* 
* 
* ``` 
* @classes 
* SecureStorageObject 
*/ 
var SecureStorage = SecureStorage_1 = (function (_super) { 
    __extends(SecureStorage, _super); 
    function SecureStorage() { 
     return _super !== null && _super.apply(this, arguments) || this; 
    } 
    /** 
    * Creates a namespaced storage. 
    * @param store {string} 
    * @returns {Promise<SecureStorageObject>} 
    */ 
    SecureStorage.prototype.create = function (store) { 
     return new Promise(function (res, rej) { 
      var instance = new (SecureStorage_1.getPlugin())(
       function() { 
        res(new SecureStorageObject(instance)); 
       }, 
       function() { 
        rej(new SecureDeviceObject(instance)); 
       }, 
       store); 
     }); 
    }; 
    return SecureStorage; 
}(IonicNativePlugin)); 
SecureStorage.decorators = [ 
    { type: Injectable }, 
]; 
/** @nocollapse */ 
SecureStorage.ctorParameters = function() { return []; }; 
__decorate([ 
    CordovaCheck(), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", [String]), 
    __metadata("design:returntype", Promise) 
], SecureStorage.prototype, "create", null); 
SecureStorage = SecureStorage_1 = __decorate([ 
    Plugin({ 
     pluginName: 'SecureStorage', 
     plugin: 'cordova-plugin-secure-storage', 
     pluginRef: 'cordova.plugins.SecureStorage', 
     repo: 'https://github.com/Crypho/cordova-plugin-secure-storage', 
     platforms: ['Android', 'Browser', 'iOS', 'Windows'] 
    }) 
], SecureStorage); 
export { SecureStorage }; 
var SecureStorage_1; 
//# sourceMappingURL=index.js.map 

Ensuite, vous serez en mesure d'utiliser:

private createSecureStorage() { 
     this.secureStorageAPI.create(this.storeName).then( 
      (storage: SecureStorageObject) => { 
       console.log("secure"); 
       this.secureStorage = storage; 
     }).catch( 
      (secureDeviceObject) => { 
       this.dialogs.alert('Please enable the screen lock on your device. This app cannot operate securely without it.').then( 
        () => { 
         // Alert Dismissed, should open the secure lockscreen settings here 
         secureDeviceObject.secureDevice().then( 
         () => { 
          // Try again 
          console.log("Success"); 
          this.createSecureStorage(); 
         }).catch(() => { 
          // Try again 
          console.log(" Error ") 
          this.createSecureStorage(); 
         }) 
        }); 
      }); 
    } 

Qu'est-ce qui a changé?

Ce que j'ai fait est de déplacer la fonction secureDevice vers un nouvel objet appelé SecureDeviceObject et changé les décorateurs. En faisant cela, vous ne pouvez pas utiliser cet objet pour essayer d'appeler le get et set fonctions, etc.

Ceci est le nouvel objet:

var SecureDeviceObject = (function() { 
    function SecureDeviceObject(_objectInstance) { 
     this._objectInstance = _objectInstance; 
    } 

    /** 
     * Brings up the screen-lock settings 
     * @returns {Promise<any>} 
     */ 
    SecureStorageObject.prototype.secureDevice = function() { return; }; 
    return SecureDeviceObject; 
}()); 

Alors j'ai changé le decorater:

__decorate([ 
    CordovaInstance(), 
    __metadata("design:type", Function), 
    __metadata("design:paramtypes", []), 
    __metadata("design:returntype", Promise) 
], SecureDeviceObject.prototype, "secureDevice", null); 

le dernier changement fait rejeter la promesse du retour secureDeviceObject:

SecureStorage.prototype.create = function (store) { 
     return new Promise(function (res, rej) { 
      var instance = new (SecureStorage_1.getPlugin())(
       function() { 
        res(new SecureStorageObject(instance)); 
       }, 
       function() { 
        rej(new SecureDeviceObject(instance)); 
       }, 
       store); 
     }); 
    }; 

Je suppose que cela n'est pas la meilleure solution possible, mais c'était le meilleur que je peux faire: D Testé sur Android 4 jusqu'à 8.Travailler sur tous ceux-là!

aide quelqu'un espère que cela :)

Merci @JudgeFudge pour moi pointant dans la bonne direction

+0

Hey, bon travail, pouvez-vous fermer ce bug avec votre code s'il vous plaît? :) https://github.com/ionic-team/ionic-native/issues/1625 – Servuc

2

Ce problème est déjà détecté en tant que problème, voir: https://github.com/ionic-team/ionic-native/issues/1944.

Si vous avez besoin d'une solution rapide pour cela, vous pouvez essayer l'une des étapes suivantes:

1) Downgrade le plugin ionique SecureStorage, peut-être ce problème ne se produit pas dans une version antérieure.

2) Essayez de résoudre vous-même le problème. Vous pouvez trouver les sources dans votre dossier node_modules ici (si vous avez besoin d'aide avec cela, je peux essayer de voir cela plus tard):

node_modules \ cordova-plugin-secure-storage \ src \ android \ SecureStorage .java node_modules \ cordova-plugin-secure-storage \ src \ ios \ SecureStorage.m

.

+0

Thnx! Je n'ai pas pu trouver ce problème. Je vais essayer de modifier le plugin moi-même. Si j'ai des questions, je vous le ferai savoir. – Juxture

+0

Après quelques recherches j'ai réussi à résoudre le problème. Je vais faire des tests approfondis et poster le code ici. – Juxture