![](/img/trans.png)
[英]Authenticate with CouchDB and insert new database via HTTP PUT in Android app
[英]Cannot add user to database/_security in CouchDB using HTTP PUT
在我的Android应用中,我试图通过HTTP PUT将用户添加到CouchDB数据库的/ _security文档中。 如果我尝试通过使用Cookie身份验证对我的管理员用户进行身份验证,或者仅通过将管理数据插入url中(如下所示)来执行此操作,则会收到错误消息。
指向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}
一旦使用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"}
如果我使用上述方法将用户JSON作为普通文档插入(例如)到http://url:port/databasename/new_document
,则插入JSON不会出现任何错误。 因此,我猜应该正确格式化JSON字符串。
因此,我的问题是,我在这里想念什么? 看来我无法立即进行身份验证并将数据放入请求正文中。 如何从代码正确地将用户插入数据库的/ _security文档?
您可以尝试使用UsernamePasswordCredentials
创建它,而不是手动创建基本的auth标头,例如
HttpPut put = new HttpPut(url);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userName, password);
put.addHeader( BasicScheme.authenticate(creds,"US-ASCII",false) );
...
HttpResponse response = client.execute(put);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.