Replicator / ReplicatorBuilder忽略URI凭据

时间:2017-09-09 22:02:48

标签: java android couchdb cloudant

到目前为止,我正在使用Cloudant-sync android最新版本:2.0.2并针对Android api 21+ 我的服务器数据库是CouchDB 2.1.0

我正在尝试从我的Android应用程序触发复制拉动,以更新本地数据库。 我将源URI提供给ReplicatorBuilder,如: “https:// user:password @ databaseurl / db_name” (详见https://github.com/cloudant/sync-android/blob/master/doc/replication.md) 但是在生成的复制器对象中,如果我检查“replicator.strategy.sourceDb”,那么db uri就是 “https:// databaseurl / db_name”,所以,我得到了非常规的(如果我停用数据库服务器上的安全检查,它可以正常工作)

这是我正在运行的代码:

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

我做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,问题似乎在于CookieAuthentication(当URI在URI中传递时,它是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;
    }
}