无法使用HTTP PUT将用户添加到CouchDB中的数据库/ _security

时间:2014-08-13 16:20:05

标签: java android authentication couchdb http-authentication

问题

在我的Android应用中,我试图通过HTTP PUT将用户添加到我的CouchDB数据库的 / _ security 文档中。如果我尝试通过使用Cookie身份验证对管理员用户进行身份验证,或者只是将管理员数据插入到以下网址中,我会收到错误。

PUT指向的URL(如果不使用Cookie身份验证):

http://admin_name:admin_password@url:port/databasename/_security

我在两种情况下都收到错误:

  

身份验证错误:无法响应其中任何一项   挑战:{} {“错误”:“未经授权”,“原因”:“你不是数据库或   服务器管理员。“}

如果我使用curl通过命令行执行此操作,则插入用户时没有任何问题:

~$ curl -X PUT http://admin:pw@ip:port/databasename/_security -d '{"admins":{"names":[],"roles":[]},"members":{"names":["participant_1"],"roles":[]}}'

> {"ok":true}

我的aproach

只要在我的一个HTTP PUT标头中使用“授权”选项进行身份验证,就不再有问题。

private boolean putJSONWithAuthentication(String userName, String password, String json, String url) {

    // url = http://url:port/databasename/_security
    // json = {"admins":{"names":[],"roles":[]},"members":{"names":["participant_1"],"roles":[]}}
    HttpClient client = new DefaultHttpClient();
    HttpPut put = new HttpPut(url);

    String authenticationData = userName+":"+password;
    String encoding = Base64.encodeToString(authenticationData.getBytes(Charset.forName("utf-8")), Base64.DEFAULT);

    try {
        StringEntity stringEntity = new StringEntity(json,"utf-8");
        put.setEntity(stringEntity);
        put.setHeader("Content-type", "application/json; charset=utf-8");
        put.setHeader("Accept", "application/json");
        put.setHeader("Authorization", "Basic " + encoding);

        HttpResponse response = client.execute(put);
        BufferedReader rd     = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line = "";
        while ((line = rd.readLine()) != null) {
            System.out.println(line);
        }
        return true;

    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }       
}

但是,我收到此错误:

> {"error":"bad_request","reason":"invalid_json"}

如果我使用上述方法将我的user-JSON作为常规文档插入,例如,http://url:port/databasename/new_document,则插入JSON时没有任何错误。因此,我猜JSON字符串应该正确格式化。

因此,我的问题是,我在这里缺少什么?好像我无法验证并立即将数据放入请求正文中。如何从代码中正确地将用户插入数据库的/ _security文档?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用UsernamePasswordCredentials创建基本身份验证标头,例如

,而不是手动创建基本身份验证标头
HttpPut put = new HttpPut(url);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userName, password);
put.addHeader( BasicScheme.authenticate(creds,"US-ASCII",false) );
...
HttpResponse response = client.execute(put);