gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:33:21 25 4
gpt4 key购买 nike

问题

在我的 Android 应用程序中,我尝试通过 HTTP PUT 将用户添加到我的 CouchDB 数据库的 /_security 文档中。如果我尝试通过使用 Cookie 身份验证来验证管理员用户或简单地将管理数据插入到 URL 中(如下所示)来执行此操作,我会收到错误。

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

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

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

Authentication error: Unable to respond to any of these challenges: {} {"error":"unauthorized","reason":"You are not a db or server admin."}

如果我使用curl 通过命令行执行此操作,则插入用户不会出现任何问题:

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

> {"ok":true}

我的方法

一旦我使用 HTTP PUT header 之一中的“授权”选项进行身份验证,身份验证就不再是问题了。

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 创建它,而不是手动创建基本身份验证 header ,例如

HttpPut put = new HttpPut(url);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userName, password);
put.addHeader( BasicScheme.authenticate(creds,"US-ASCII",false) );
...
HttpResponse response = client.execute(put);

关于java - 无法使用 HTTP PUT 将用户添加到 CouchDB 中的数据库/_security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com