সমস্ত অক্ষরের অনুরোধের জন্য অনুমোদনের শিরোনাম সংযুক্ত করুন


127

আমার একটি প্রতিক্রিয়া / রিডাক্স অ্যাপ্লিকেশন রয়েছে যা একটি এপিআই সার্ভার থেকে একটি টোকেন আনে। ব্যবহারকারীর অনুমোদনের পরে আমি সমস্ত অক্ষর অনুরোধগুলিকে অ্যাকশনের প্রতিটি অনুরোধের সাথে ম্যানুয়ালি এটি সংযুক্ত না করে অনুমোদনের শিরোনাম হিসাবে টোকেন তৈরি করতে চাই। আমি প্রতিক্রিয়া / রিডুএক্সে মোটামুটি নতুন এবং সর্বোত্তম পদ্ধতির বিষয়ে নিশ্চিত নই এবং গুগলে কোনও মানের হিট খুঁজে পাচ্ছি না।

এখানে আমার রিডাক্স সেটআপ:

// actions.js
import axios from 'axios';

export function loginUser(props) {
  const url = `https://api.mydomain.com/login/`;
  const { email, password } = props;
  const request = axios.post(url, { email, password });

  return {
    type: LOGIN_USER,
    payload: request
  };
}

export function fetchPages() {
  /* here is where I'd like the header to be attached automatically if the user
     has logged in */ 
  const request = axios.get(PAGES_URL);

  return {
    type: FETCH_PAGES,
    payload: request
  };
}

// reducers.js
const initialState = {
  isAuthenticated: false,
  token: null
};

export default (state = initialState, action) => {
  switch(action.type) {
    case LOGIN_USER:
      // here is where I believe I should be attaching the header to all axios requests.
      return {
        token: action.payload.data.key,
        isAuthenticated: true
      };
    case LOGOUT_USER:
      // i would remove the header from all axios requests here.
      return initialState;
    default:
      return state;
  }
}

আমার টোকেনটি হ'ল রিডেক্স স্টোরে সংরক্ষণ করা হয়েছে state.session.token

কীভাবে এগিয়ে যাব আমি কিছুটা হারিয়েছি lost আমি আমার রুট ডিরেক্টরিতে কোনও ফাইলের অক্ষর তৈরির চেষ্টা করেছি এবং নোড_মডিউলগুলির পরিবর্তে আপডেট / আমদানি করেছি কিন্তু রাষ্ট্র পরিবর্তন হওয়ার সাথে সাথে এটি শিরোনাম সংযুক্ত করছে না। কোন প্রতিক্রিয়া / ধারণা অনেক প্রশংসা করা হয়, ধন্যবাদ।


সার্ভার থেকে টোকেন পাওয়ার পরে আপনি কোথায় অনুমোদনের টোকেন সংরক্ষণ করছেন? localStorage?
হার্ডিক মোদা

উত্তর:


199

এটি অর্জনের একাধিক উপায় রয়েছে। এখানে, আমি দুটি সাধারণ পদ্ধতির ব্যাখ্যা করেছি।

1. আপনি যে কোনও অনুরোধগুলি আটকাতে এবং অনুমোদনের শিরোনাম যুক্ত করতে অক্ষগুলি ইন্টারসেপ্টর ব্যবহার করতে পারেন ।

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    const token = store.getState().session.token;
    config.headers.Authorization =  token;

    return config;
});

2. থেকে ডকুমেন্টেশন এর axiosআপনি দেখতে পারেন একটি প্রক্রিয়া যা পাওয়া যায় আপনি সেট ডিফল্ট হেডার যা প্রতি অনুরোধ আপনার করা পাঠানো হবে করতে পারবেন নেই।

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

সুতরাং আপনার ক্ষেত্রে:

axios.defaults.headers.common['Authorization'] = store.getState().session.token;

আপনি যদি চান, আপনি একটি স্ব-সম্পাদনযোগ্য ফাংশন তৈরি করতে পারেন যা টোকেন দোকানে উপস্থিত থাকাকালীন অনুমোদনের শিরোনামটি সেট করে will

(function() {
     String token = store.getState().session.token;
     if (token) {
         axios.defaults.headers.common['Authorization'] = token;
     } else {
         axios.defaults.headers.common['Authorization'] = null;
         /*if setting null does not remove `Authorization` header then try     
           delete axios.defaults.headers.common['Authorization'];
         */
     }
})();

এখন আপনার আর প্রতিটি অনুরোধের সাথে ম্যানুয়ালি টোকেন সংযুক্ত করার দরকার নেই। আপনি উপরের ফাংশনটি সেই ফাইলটিতে রাখতে পারেন যা প্রতিবার কার্যকর হওয়ার গ্যারান্টিযুক্ত ( যেমন: ফাইল যা রুটগুলিতে থাকে)।

আশা করি এটা সাহায্য করবে :)


1
ইতিমধ্যে রডেক্স-টিকে থাকা ব্যবহার করছে তবে টোকনটি হেডারে সংযুক্ত করতে মিডলওয়্যারটি একবার দেখে নিবে, ধন্যবাদ!
অডাব্লাস্টার

1
@awwester হেডারে টোকেন সংযুক্ত করতে আপনার মিডলওয়্যারের দরকার নেই। শিরোনামে টোকেন সংযুক্ত করা axios.defaults.header.common[Auth_Token] = tokenযেমন সহজ।
হার্ডিক মোদা

4
@ হার্দিকমোদা আমি আগ্রহী যে কেউ কীভাবে এটি আনতে পারে এফআইপি-র মাধ্যমে এটি করতে সক্ষম।
রোল্যান্ড

@ রোল্যান্ড আমি বিশ্বাস করি, এটি অর্জনের জন্য আপনার আনতে হবে ফেচ এপিআই ওভার একটি র‌্যাপার। এই প্রশ্নের বিশদ উত্তর ওপি কর্তৃক জিজ্ঞাসা করা প্রশ্নের আওতার বাইরে। আপনি অন্য একটি প্রশ্ন জিজ্ঞাসা করতে পারেন :)
হার্ডিক মোদা

2
হাই @ হার্ডিকমোদা আমি টোকেনটি পুনর্নবীকরণ করতে চাইলে যদি সেট টোকেনের জন্য আমি ডিফল্ট শিরোনাম ব্যবহার করি তবে এটি আবার শিরোনামে সেট করা যাবে না। এটা কি ঠিক? সুতরাং আমি ইন্টারসেপ্টর ব্যবহার করতে হবে।
শিক্ষানবিশ

48

আপনি যদি "অক্ষ" ব্যবহার করেন: "^ 0.17.1" সংস্করণ আপনি এটি করতে পারেন:

অক্ষের উদাহরণ তৈরি করুন:

// 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;
  });

তারপরে যে কোনও অনুরোধের জন্য টোকেনটি স্থানীয় স্টোরেজ থেকে নির্বাচন করা হবে এবং অনুরোধ শিরোনামগুলিতে যুক্ত করা হবে।

আমি এই কোড সহ সমস্ত অ্যাপ্লিকেশনটিতে একই উদাহরণটি ব্যবহার করছি:

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();

শুভকামনা।


@ আনন্দের সাথে NguyễnPhúc, পুরো পয়েন্ট axios এর "interceptors খুব" ব্যবহার হয়
llioor

45

আমার কাছে সর্বোত্তম সমাধান হ'ল একটি ক্লায়েন্ট পরিষেবা তৈরি করা যা আপনি আপনার টোকেনটি এটি মোড়ানোর জন্য ব্যবহার করে ইনস্ট্যান্ট করবেন 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);

এই ক্লায়েন্টটিতে, আপনি যেমন চান তেমন লোকাল স্টোরেজ / কুকি থেকেও টোকেনটি পুনরুদ্ধার করতে পারেন।


1
আপনি যদি "অ্যাপ্লিকেশন-টাইপ" শিরোনাম দিয়ে অনুরোধ করুন (বাজেট) করতে চান তবে কী হবে। আপনার পদ্ধতির সাথে ডিফল্ট অপশনগুলি থেকে শিরোনামগুলি অনুরোধ থেকে শিরোনামগুলি ওভারটাইন হবে। আমি ঠিক আছি? ধন্যবাদ.
নিপুরও

9

একইভাবে, আমাদের কাছে এই জাতীয় কলগুলি থেকে টোকেন সেট করতে বা মুছতে একটি ফাংশন রয়েছে:

import axios from 'axios';

export default function setAuthToken(token) {
  axios.defaults.headers.common['Authorization'] = '';
  delete axios.defaults.headers.common['Authorization'];

  if (token) {
    axios.defaults.headers.common['Authorization'] = `${token}`;
  }
}

আমরা শুরুতে সর্বদা বিদ্যমান টোকেনটি পরিষ্কার করি, তারপরে প্রাপ্ত একটিটি স্থাপন করি।


5

আপনি যদি ভবিষ্যতে অন্যান্য এপিআই রুটগুলিতে কল করতে চান এবং আপনার টোকেনটি স্টোরটিতে রাখতে চান তবে রিডেক্স মিডলওয়্যার ব্যবহার করার চেষ্টা করুন ।

মিডলওয়্যার একটি এপিআই ক্রিয়া শোনার জন্য এবং সেই অনুসারে অক্ষের মাধ্যমে এপিআই অনুরোধগুলি প্রেরণ করতে পারে।

এখানে একটি খুব প্রাথমিক উদাহরণ:

ক্রিয়া / 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'
  };
}

মিডলওয়্যার / 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);
};

3

কখনও কখনও আপনি একটি কেস পাবেন যেখানে অক্ষ সহ কিছু অনুরোধগুলি এমন বিন্দুগুলিতে নির্দেশিত হয় যা অনুমোদন শিরোনামগুলি গ্রহণ করে না। সুতরাং, কেবল অনুমোদিত ডোমেনে অনুমোদনের শিরোনাম সেট করার বিকল্প উপায় নীচের উদাহরণ হিসাবে রয়েছে। প্রতিক্রিয়ার অ্যাপ্লিকেশন যেমন রুটস ফাইলে চলতে থাকে প্রতিটি সময় কার্যকর হয় এমন কোনও ফাইলে নিম্নলিখিত ফাংশনটি রাখুন।

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

নীচের মতো করে নতুন উদাহরণ তৈরি করার চেষ্টা করুন

var common_axios = axios.create({
    baseURL: 'https://sample.com'
});

// Set default headers to common_axios ( as Instance )
common_axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
// Check your Header
console.log(common_axios.defaults.headers);

এটি কিভাবে ব্যবহার করতে

common_axios.get(url).......
common_axios.post(url).......

0
export const authHandler = (config) => {
  const authRegex = /^\/apiregex/;

  if (!authRegex.test(config.url)) {
    return store.fetchToken().then((token) => {
      Object.assign(config.headers.common, { Authorization: `Bearer ${token}` });
      return Promise.resolve(config);
    });
  }
  return Promise.resolve(config);
};

axios.interceptors.request.use(authHandler);

কিছু অনুরূপ বাস্তবায়নের চেষ্টা করার সময় কিছু গোটচেগুলিতে ছড়িয়ে পড়ে এবং এই উত্তরগুলির উপর ভিত্তি করে এটিই আমি সামনে এসেছি। আমি যে সমস্যার মুখোমুখি হয়েছিলাম সেগুলি হ'ল:

  1. আপনার স্টোরটিতে টোকেন পাওয়ার জন্য অনুরোধটির জন্য যদি অক্ষগুলি ব্যবহার করা হয় তবে শিরোনাম যুক্ত করার আগে আপনাকে পাথটি সনাক্ত করতে হবে। যদি আপনি এটি না করেন তবে এটি সেই কলটিতে শিরোলেখটি যুক্ত করার চেষ্টা করবে এবং একটি বৃত্তাকার পথের সমস্যাটিতে প্রবেশ করবে। অন্যান্য কলগুলি সনাক্ত করতে রেজেক্স যুক্ত করার বিপরীতটিও কাজ করবে
  2. স্টোর যদি কোনও প্রতিশ্রুতি ফিরিয়ে দিচ্ছে, আপনাকে অ্যানুথহ্যান্ডলার ফাংশনে প্রতিশ্রুতি সমাধানের জন্য আপনার দোকানে কলটি ফিরে আসতে হবে। অ্যাসিঙ্ক / ওয়েট কার্যকারিতা এটিকে আরও সহজ / আরও সুস্পষ্ট করে তুলবে
  3. যদি লেখক টোকেনের কলটি ব্যর্থ হয় বা টোকেন পাওয়ার জন্য কল হয়, আপনি এখনও কনফিগারেশনের মাধ্যমে একটি প্রতিশ্রুতি সমাধান করতে চান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.