我有一个关闭的CouchDB应用程序(因此它需要身份验证)。 我正在从NodeJS后端连接到它,该后端必须具有管理员访问权限并执行其操作。因此,我想拦截未经身份验证或过期的请求。
为此,我axios.create()
选了client
。该客户端具有一个拦截器,该拦截器使用原始axios
对象进行身份验证,然后将响应中的cookie设置为client
的默认标头。代码看起来像这样:
import axios from 'axios';
const baseURL = 'http://127.0.0.1:5984/';
const name = 'admin';
const password = 'mypass';
const cookieTimeout = (10 * 60 * 1000);
let cookieCreated;
const client = axios.create({
baseURL,
headers: {
Accept: 'application/json',
post: { 'Content-Type': 'application/x-www-form-urlencoded' },
},
});
const cookieInterceptor = (config) => {
const now = Date.now();
if (!cookieCreated || cookieCreated + cookieTimeout <= now) {
// Using the default 'axios' object because if we use 'client',
// it will loop into intercepting its own request again.
return axios.post(`${baseURL}/_session`, { name, password })
.then((response) => {
// Cache a new cookie and return it
cookieCreated = now;
client.defaults.headers.common.Cookie = response.headers['set-cookie'].join(';');
return config;
})
.catch(error => console.log(error));
}
return Promise.resolve(config);
};
client.interceptors.request.use(cookieInterceptor);
export default client;
这可能是次优的做法,但是实际的问题是,启动应用程序后首次调用client.get()
并不会成为经过身份验证的请求。事后再好,所以可能是身份验证过程在后台进行了。
问题是,在发出实际请求之前,如何使拦截器对客户端进行身份验证?拦截器是正确的方法吗?另外,如果要解决这个问题的方法不太可怕,那么我完全愿意提出建议。