使用Axios验证NodeJS

时间:2018-09-30 17:13:36

标签: javascript node.js axios

我有一个关闭的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()并不会成为经过身份验证的请求。事后再好,所以可能是身份验证过程在后台进行了。

问题是,在发出实际请求之前,如何使拦截器对客户端进行身份验证?拦截器是正确的方法吗?另外,如果要解决这个问题的方法不太可怕,那么我完全愿意提出建议。

0 个答案:

没有答案