CouchDB 0x00 认证
自CouchDB 3.x版本要求访问数据库时必须进行认证。在访问任何实际数据之前,需向/_session发送一个POST请求,要求包括:
(1)Content-Type必须为application/json。
(2)请求体必须为{"name":"xxx", "password":"yyyy"}
如果认证成功,这个请求的响应头部会包含一个Set-Cookie域,内容大概是:
AuthSession=YWRtaW46NjIxOEQyRDE6tlGcI_YQ_5Dmv3pBsWsjR6W8BSg; Version=1; Expires=Fri, 25-Feb-2022 13:10:01 GMT; Max-Age=600; Path=/; HttpOnly
添加一个新的Cookie。此后的每一个访问请求头部必须带一个Cookie域,内容就是从AuthSession到第一个分号之间的内容:
AuthSession=YWRtaW46NjIxOEQyRDE6tlGcI_YQ_5Dmv3pBsWsjR6W8BSg
这个Cookie是放在头部的明文,并不安全,应当添加一个Apache做SSL代理。浏览器一般会自动添加这个Cookie,但如果是用node.js等环境,就要考虑手动添加了。一段用于验证的实例代码如下所示:
const https = require("http");
let getToken = () => {
return new Promise((resolve, reject) => {
var req = https.request("http://localhost:5984/_session", {
method: "POST",
headers: {
"Content-Type": "application/json",
}
}, (response) => {
if (!response.headers["set-cookie"]) {
reject("Authentication failed.");
}
let token = response.headers["set-cookie"][0];
let delimaPos = token.indexOf(";");
token = token.substring(0, delimaPos);
resolve(token);
});
req.write(JSON.stringify({
name: "admin",
password: "1234546"
}));
req.end();
});
};
getToken().then((value) => {
console.log(value);
}, (reason) => {
console.error(reason);
});