Attach Authorization header for all axios requests

前端 未结 9 1958
灰色年华
灰色年华 2020-12-04 05:17

I have a react/redux application that fetches a token from an api server. After the user authenticates I\'d like to make all axios requests have that token as an Authorizati

相关标签:
9条回答
  • 2020-12-04 05:31

    The best solution to me is to create a client service that you'll instantiate with your token an use it to wrap axios.

    import axios from 'axios';
    
    const client = (token = null) => {
        const defaultOptions = {
            headers: {
                Authorization: token ? `Token ${token}` : '',
            },
        };
    
        return {
            get: (url, options = {}) => axios.get(url, { ...defaultOptions, ...options }),
            post: (url, data, options = {}) => axios.post(url, data, { ...defaultOptions, ...options }),
            put: (url, data, options = {}) => axios.put(url, data, { ...defaultOptions, ...options }),
            delete: (url, options = {}) => axios.delete(url, { ...defaultOptions, ...options }),
        };
    };
    
    const request = client('MY SECRET TOKEN');
    
    request.get(PAGES_URL);
    

    In this client, you can also retrieve the token from the localStorage / cookie, as you want.

    0 讨论(0)
  • 2020-12-04 05:37

    If you use "axios": "^0.17.1" version you can do like this:

    Create instance of axios:

    // Default config options
      const defaultOptions = {
        baseURL: <CHANGE-TO-URL>,
        headers: {
          'Content-Type': 'application/json',
        },
      };
    
      // Create instance
      let instance = axios.create(defaultOptions);
    
      // Set the AUTH token for any request
      instance.interceptors.request.use(function (config) {
        const token = localStorage.getItem('token');
        config.headers.Authorization =  token ? `Bearer ${token}` : '';
        return config;
      });
    

    Then for any request the token will be select from localStorage and will be added to the request headers.

    I'm using the same instance all over the app with this code:

    import axios from 'axios';
    
    const fetchClient = () => {
      const defaultOptions = {
        baseURL: process.env.REACT_APP_API_PATH,
        method: 'get',
        headers: {
          'Content-Type': 'application/json',
        },
      };
    
      // Create instance
      let instance = axios.create(defaultOptions);
    
      // Set the AUTH token for any request
      instance.interceptors.request.use(function (config) {
        const token = localStorage.getItem('token');
        config.headers.Authorization =  token ? `Bearer ${token}` : '';
        return config;
      });
    
      return instance;
    };
    
    export default fetchClient();
    

    Good luck.

    0 讨论(0)
  • 2020-12-04 05:41

    Sometimes you get a case where some of the requests made with axios are pointed to endpoints that do not accept authorization headers. Thus, alternative way to set authorization header only on allowed domain is as in the example below. Place the following function in any file that gets executed each time React application runs such as in routes file.

    export default () => {
        axios.interceptors.request.use(function (requestConfig) {
            if (requestConfig.url.indexOf(<ALLOWED_DOMAIN>) > -1) {
                const token = localStorage.token;
                requestConfig.headers['Authorization'] = `Bearer ${token}`;
            }
    
            return requestConfig;
        }, function (error) {
            return Promise.reject(error);
        });
    
    }
    
    0 讨论(0)
提交回复
热议问题