2017-09-09 1 views
-1

Ich benutze Cloudant-Sync android neueste Version bisher: 2.0.2 und Targeting Android API 21+.
Meine Server-Datenbank ist CouchDB 2.1.0Replicator/ReplicatorBuilder ignoriert URI-Anmeldeinformationen

Ich versuche, eine Replikation ziehen von meiner Android-App, um die lokale db zu aktualisieren. Ich gebe die Quelle URI zum ReplicatorBuilder wie: "https: // user: password @ databaseurl/db_name" (wie hier https://github.com/cloudant/sync-android/blob/master/doc/replication.md specificated) aber in dem erzeugten Replikator Objekt, wenn ich „replicator.strategy inspizieren. SourceDB“die db uri ist nur "https: // databaseurl/db_name" und so, bekomme ich unhautorized (es funktioniert gut, wenn ich die Sicherheitskontrolle auf dem Datenbank-Server zu deaktivieren)

das ist mein Lauf Code:

public ReplicationListener pullAllAsync(Databases db_name) { 
    try { 
     URI uri = db_name.getServerURI(); 
     DocumentStore ds = DocumentStore.getInstance(new File(db_name.getMobilePath(), db_name.toString())); 
     Replicator replicator = ReplicatorBuilder.pull().from(uri).to(ds).build(); 
     ReplicationListener listener = new ReplicationListener(replicator); 
     replicator.getEventBus().register(listener); 
     replicator.start(); 
     return listener; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     LogRepository.getInstance().escribirLog(LogRepository.TipoLog.ERROR, null, e, true); 
     return null; 
    } 
} 

Mache ich etwas falsch?

Dank!

+0

Fügen Sie Ihren Code hier ein. Keine Bilder davon. –

+0

Sorry, das habe ich schon bearbeitet. Vielen Dank –

Antwort

0

Nun, das Problem scheint mit der CookieAuthentication (das ist die Standard-Authentifizierungsmethode des Replikators, wenn Kredits mit in der URI übergeben werden) Ich weiß nicht wirklich, warum es scheitert, weil die CouchDB Server-Instanz ist so konfiguriert, dass CookieAuthentication akzeptiert wird.

Wie auch immer, dies ist möglicherweise nicht die bestmögliche Lösung, aber es ist eine gute Abhilfe. Ich habe dies durch Erzwingen der BasicAuthentication-Methode wie folgt ausgeführt:

public ReplicationListener pullAllAsync(Databases db_name) { 
    try { 
     URI uri = db_name.getServerURI(); 

     DocumentStore ds = DocumentStore.getInstance(new File(db_name.getMobilePath(), db_name.toString())); 
     Replicator replicator = ReplicatorBuilder 
       .pull() 
       .from(uri) 
       .to(ds) 

       //WORKAROUND: forces BasicAuthentication method instead of CookieAuthentication 
       .addRequestInterceptors(new BasicAuthInterceptor(uri.getRawUserInfo())) 
       .build(); 

     ReplicationListener listener = new ReplicationListener(replicator); 
     replicator.getEventBus().register(listener); 
     replicator.start(); 
     return listener; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     LogRepository.getInstance().escribirLog(LogRepository.TipoLog.ERROR, null, e, true); 
     return null; 
    } 
}