Skip to content

Instantly share code, notes, and snippets.

@benpickles
Created March 18, 2016 16:19
Show Gist options
  • Star 45 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save benpickles/b465db90ca11adc9ea00 to your computer and use it in GitHub Desktop.
Save benpickles/b465db90ca11adc9ea00 to your computer and use it in GitHub Desktop.
Inject an Authorization header into a redux-api-middleware request with a Redux middleware.
import { CALL_API } from 'redux-api-middleware'
export function fetchLocations() {
return {
[CALL_API]: {
endpoint: 'http://api.somesite.com/api/locations',
method: 'GET',
// Don't have to manually add the Authorization header to every request.
headers: { 'Content-Type': 'application/json' },
types: ['REQUEST', 'SUCCESS', 'FAILURE']
}
}
}
// ...Likely some other imports such as React etc.
import { createStore, applyMiddleware } from 'redux'
import { apiMiddleware } from 'redux-api-middleware'
// Our custom middleware.
import apiAuthInjector from './apiAuthInjector'
const store = createStore(
reducers,
applyMiddleware(
apiAuthInjector, // Put it somewhere before `apiMiddleware`.
apiMiddleware,
)
)
// ...the rest of your app setup.
import { CALL_API } from 'redux-api-middleware'
import ls from 'local-storage'
export default function() {
return function(next) {
return function(action) {
const callApi = action[CALL_API]
// Check if this action is a redux-api-middleware action.
if (callApi) {
// Inject the Authorization header from localStorage.
callApi.headers = Object.assign({}, callApi.headers, {
Authorization: ls.get('id_token') || '',
})
}
// Pass the FSA to the next action.
return next(action)
}
}
}
@ontimond
Copy link

ontimond commented Jul 28, 2020

Hi, i modified the apiAuthInjector method to be compatible with the new version of redux-api-middleware

import { isRSAA, RSAA } from 'redux-api-middleware'
import ls from 'local-storage'
import produce from "immer"

export function apiAuthInjector() {
    return function (next) {
        return function (action) {

            // Check if this action is a redux-api-middleware action.
            if (isRSAA(action)) {
                let call = action[RSAA];
                call.headers = produce(call.headers || {}, draftHeaders => {
                    draftHeaders.Authorization = ls('access_token') || '';
                });
            }

            // Pass the FSA to the next action.
            return next(action)
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment