2017-09-09 1 views
-1

Cloudant-sync android 최신 릴리스 (2.0.2) 및 Android api 21+를 타겟팅하고 있습니다.
내 서버 데이터베이스는 CouchDB 2.1.0입니다.Replicator/ReplicatorBuilder가 URI 자격 증명을 무시합니다.

로컬 데이터베이스를 업데이트하기 위해 내 안드로이드 응용 프로그램에서 복제 풀을 트리거하려고합니다. "https : // user : password @ databaseurl/db_name" (여기 https://github.com/cloudant/sync-android/blob/master/doc/replication.md으로 지정) 과 같이 replicatorBuilder의 소스 URI를 제공하지만 replicator.strategy를 검사하면 생성 된 replicator 객체에 URI를 제공합니다. // databaseurl/DB_NAME "그래서, 나는 (I 데이터베이스 서버의 보안 검사를 비활성화하면 잘 작동)

이 내 실행 코드 unhautorized 수 : sourceDb은 HTTPS"DB를 URI는 이다 "

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; 
    } 
} 

내가 잘못하고 있니?

감사합니다.

+0

여기에 코드를 붙여 넣으십시오. 그것의 이미지가 아닙니다. –

+0

죄송합니다. 이미 편집했습니다. 감사 –

답변

0

글쎄, CookieAuthentication (URI에 creds가 전달 될 때 Replicator의 기본 인증 방법)과 관련된 문제인 것 같습니다. CouchDB 서버 인스턴스 때문에 실패한 이유는 모르겠습니다. CookieAuthentication을 허용하도록 구성됩니다.

어쨌든이 방법이 최선의 해결책은 아니지만 충분히 좋은 해결책 일 수 있습니다. 다음과 같이 BasicAuthentication 메서드를 강제로이 작업을 수행했습니다.

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; 
    } 
} 
관련 문제