Attach Authorization header for all axios requests

前端 未结 9 1996
灰色年华
灰色年华 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条回答
  •  猫巷女王i
    2020-12-04 05:20

    If you want to call other api routes in the future and keep your token in the store then try using redux middleware.

    The middleware could listen for the an api action and dispatch api requests through axios accordingly.

    Here is a very basic example:

    actions/api.js

    export const CALL_API = 'CALL_API';
    
    function onSuccess(payload) {
      return {
        type: 'SUCCESS',
        payload
      };
    }
    
    function onError(payload) {
      return {
        type: 'ERROR',
        payload,
        error: true
      };
    }
    
    export function apiLogin(credentials) {
      return {
        onSuccess,
        onError,
        type: CALL_API,
        params: { ...credentials },
        method: 'post',
        url: 'login'
      };
    }
    

    middleware/api.js

    import axios from 'axios';
    import { CALL_API } from '../actions/api';
    
    export default ({ getState, dispatch }) => next => async action => {
      // Ignore anything that's not calling the api
      if (action.type !== CALL_API) {
        return next(action);
      }
    
      // Grab the token from state
      const { token } = getState().session;
    
      // Format the request and attach the token.
      const { method, onSuccess, onError, params, url } = action;
    
      const defaultOptions = {
        headers: {
          Authorization: token ? `Token ${token}` : '',
        }
      };
    
      const options = {
        ...defaultOptions,
        ...params
      };
    
      try {
        const response = await axios[method](url, options);
        dispatch(onSuccess(response.data));
      } catch (error) {
        dispatch(onError(error.data));
      }
    
      return next(action);
    };
    

提交回复
热议问题