3 votes

Comment changer le client http utilisé par pouchDB ?

J'utilise PouchDB et CouchDB dans une application ionique. Alors que je peux synchroniser avec succès les bases de données locales et distantes sur Chrome et Android, j'obtiens une erreur non autorisée sur Safari / iOS lorsque je lance la commande de synchronisation. Vous trouverez ci-dessous une version simplifiée de mon fournisseur de services de base de données.

import PouchDB from 'pouchdb';
import PouchDBAuthentication from 'pouchdb-authentication';

@Injectable()
export class CouchDbServiceProvider {
    private db: any;
    private remote: any;
    constructor() {
      PouchDB.plugin(PouchDBAuthentication);
      this.db = new PouchDB('localdb', {skip_setup: true});
    }
    ...
    login(credentials) {
      let couchDBurl = 'URL of my couchDB database';
      this.remote = new PouchDB(couchDBurl); 
      this.remote.logIn(credentials.username, credentials.password, function (err, response) {
            if (err) { concole.log('login error') }
            else {
                let options = { live: true, retry: true, continuous: true };
                this.db.sync(this.remote, options).on('error', (err_) => { console.log('sync error')});
            }
      })
    }
    ...
}

Dans le code ci-dessus, this.remote.logIn(...) a réussi mais this.db.sync(...) échoue. J'ai vérifié les demandes via l'onglet réseau des outils de développement et je pense que le problème est que le cookie qui est retransmis dans l'en-tête de la réponse de this.remote.logIn(...) n'est pas utilisé par les appels suivants (d'où l'erreur non autorisée). Le problème est résolu une fois que les cookies tiers sont activés sur Safari, ce qui n'est pas une option sur iOS.

Comment puis-je résoudre ce problème ?

Une solution potentielle que j'envisage est d'écraser fetch pour utiliser un client http natif (c'est-à-dire une instance de HTTP de @ionic-native/http ). Il semble que la modification des clients http soit une possibilité (par exemple, d'après ceci conversation ) mais je ne suis pas sûr de savoir comment y parvenir.

2voto

RamblinRose Points 3561

Changer la plomberie HTTP semble être une très mauvaise idée - coût en temps, principalement - sauf si vous devez absolument utiliser des sessions/cookies... Si ce n'est pas le cas, continuez à lire.

comme noté ici concernant la sécurité de pouchDB, j'ai essayé d'utiliser pouchdb-authentication quand il était activement maintenu et a changé de voie à cause de multiples problèmes (je ne me souviens pas des détails, c'était il y a 6 ans).

Notez que le dernier commit pour pouchdb-authentication semble remonter à 3 ans. Bien que l'inactivité ne soit pas un indicateur négatif à première vue - un projet peut simplement avoir atteint une conclusion solide - l'installation de pouchdb-authentication donne ceci

found 6 vulnerabilities (2 moderate, 3 high, 1 critical)

Cela, ajouté au manque d'amour porté aux plugins ces dernières années, constitue une dangereuse dette technique à ajouter à un nouveau projet.

Si possible, envoyez simplement les informations d'identification à l'aide de l'option auth lors de la création (ou de l'ouverture) d'une base de données distante, par ex.

const credentials = { username: 'foo', passwd: 'bar' };
this.remote = new PouchDB(couchDBurl, { auth: credentials }); 

Je ne me souviens pas pourquoi, mais j'ai écrit un code qui est en substance ce qui suit, et je l'ai réutilisé ad nauseum parce qu'il fonctionne simplement avec la fonction fetch option

const user = { name: 'foo', pass: 'bar' };
const options = { fetch: function (url, opts) {
    opts.headers.set('Authorization', 'Basic ' + window.btoa(user.name+':'+user.pass));
    return PouchDB.fetch(url, opts);
  }
};

this.remote = new PouchDB(couchDBurl, options); 

Je pense avoir choisi cette approche en raison de la nature de mon flux de travail d'authentification discuté dans le premier lien de cette réponse.

1voto

zinglax Points 48

Je suis d'accord avec @RamblinRose que vous pourriez avoir à inclure les en-têtes manuellement lorsque vous définissez l'objet PouchDB.

J'ai moi-même trouvé une solution lorsque je travaille avec des JWT qui doivent être inclus dans l'en-tête à des fins de synchronisation.

Voir cette réponse. Note : RxDB utilise PouchDB sous le capot, il est donc applicable à cette situation. Cela m'a aidé à synchroniser, j'espère que cela vous aidera aussi !

https://stackoverflow.com/a/64503760/5012227

1voto

LyteFM Points 506

Une solution potentielle que j'envisage est de surcharger fetch pour utiliser le client http natif (c'est-à-dire une instance de HTTP de @ionic-native/http). Il semble que la modification des clients http soit une possibilité (par exemple, d'après cette conversation) mais je ne suis pas sûr de savoir comment y parvenir.

Oui, c'est une option possible - surtout si vous voulez utiliser le pinning SSL qui ne fonctionnera qu'avec les demandes natives. Et vous n'avez pas à vous soucier de CORS (à l'exception de ionic serve ).

Vous pouvez y parvenir, par exemple, en prenant un fichier existant fetch - polyfill et le modifier pour qu'il utilise le plugin http au lieu de xhr. Et comme vous ne traiterez que du JSON lors de l'interaction avec CouchDB, vous pouvez vous débarrasser de la plupart des polyfill.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X