У меня закрытое приложение CouchDB (поэтому оно требует аутентификации).Я подключаюсь к нему из серверной части NodeJS, которая должна получить доступ администратора и делать свое дело.Поэтому я хочу перехватывать запросы, которые не прошли проверку подлинности или срок действия которых истек.
Для этого у меня есть axios.create()
da 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()
не заканчивается проверенным запросом, когда язвоню в первый раз после запуска приложения.Впоследствии это хорошо, но, вероятно, процесс аутентификации идет где-то в фоновом режиме.
Вопрос в том, как заставить мой перехватчик аутентифицировать моего клиента перед выполнением фактического запроса?Является ли перехватчик правильным способом сделать это?Кроме того, если есть менее ужасный способ сделать это, я полностью открыт для предложений.