Axios: λͺ¨λ“  μš”μ²­μ— β€‹β€‹λŒ€ν•΄ 인증 헀더λ₯Ό μ—…λ°μ΄νŠΈν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2018λ…„ 02μ›” 25일  Β·  10μ½”λ©˜νŠΈ  Β·  좜처: axios/axios

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„,

보호된 API λ¦¬μ†ŒμŠ€μ— μ‚¬μš©ν•˜λŠ” axios의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  토큰이 μžˆλŠ” auth 헀더λ₯Ό μ²¨λΆ€ν–ˆμ§€λ§Œ λ¬Έμ œλŠ” μ½˜μ†”λ‘œ μ΄λ™ν•˜μ—¬ localStorageμ—μ„œ tokem을 μ‚­μ œν•΄λ„ axiosκ°€ μ—¬μ „νžˆ μΈμŠ€ν„΄μŠ€λ‘œ μ „μ†‘ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—…λ°μ΄νŠΈλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€μ˜ 인증 헀더가 λͺ¨λ“  μš”μ²­μ—μ„œ localStorage의 토큰을 확인할 수 μžˆλŠ” μ†”λ£¨μ…˜μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”!

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이λ₯Ό μœ„ν•΄ 인터셉터 λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μš”μ²­μ˜ κΈ°λ³Έ URL이 λ‚΄ API인 경우 인증 헀더λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€(자격 증λͺ…을 제3μžμ—κ²Œ λ³΄λ‚΄λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄). 이것은 각 μš”μ²­μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ 토큰이 λ³€κ²½λ˜λ©΄(예: 토큰 μƒˆλ‘œ 고침의 결과둜) λ‹€μŒ μš”μ²­μ—μ„œ μƒˆ 토큰을 μ„ νƒν•©λ‹ˆλ‹€. λ˜ν•œ μ–΄λ–€ μ΄μœ λ‘œλ“  ν•„μš”ν•œ 경우 호좜 μ‚¬μ΄νŠΈμ—μ„œ 헀더λ₯Ό μž¬μ •μ˜ν•  수 μžˆλ„λ‘ μš”μ²­μ—μ„œ κΈ°μ‘΄ 값을 ν™•μΈν•©λ‹ˆλ‹€.

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

λͺ¨λ“  10 λŒ“κΈ€

μ „λ‹¬λœ 헀더가 λͺ¨λ“  μš”μ²­μ— β€‹β€‹λŒ€ν•΄ 느리게 ν‰κ°€λœλ‹€λ©΄ 쒋을 μœ μ‚¬ν•œ μ‚¬μš© 사둀가 μžˆμŠ΅λ‹ˆλ‹€.

생각:
헀더 ν•΄μ‹œλ₯Ό 객체( axios.create({headers: {...}}) 둜 μ—΄μ‹¬νžˆ μ „λ‹¬ν•˜λŠ” λŒ€μ‹  μš”μ²­μ΄ μ „μ†‘λ˜κΈ° 전에 평가될 헀더( axios.create({headers: () => {...}} )λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ–΄λ–»κ²Œ 생각해?
νŽΈμ§‘: 이것은 μ œμ•ˆμž…λ‹ˆλ‹€. ν˜„μž¬λ‘œμ„œλŠ” 이것이 νš¨κ³Όκ°€ μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 같은 μ‚¬μš© 사둀에 λΆ€λ”ͺμ³€λ‹€. λ‚΄κ°€ λ‹¨κΈ°μ μœΌλ‘œ ν•œ 것은 transformRequest κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. ν™•μ‹€νžˆ 해킹이며 μ½”λ“œλ² μ΄μŠ€μ— μ μ ˆν•œ 지연 λ‘œλ”© μ ‘κ·Ό 방식을 κ΅¬ν˜„ν•˜λŠ” 데 도움이 되고 μ‹ΆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ μŠ€λ‹ˆνŽ«μ€ μ•„λž˜λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. auth() λŠ” μ‚¬μš© κ°€λŠ₯ν•œ 경우 λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 토큰을 κ°€μ Έμ˜΅λ‹ˆλ‹€.

let HTTP = axios.create({
  baseURL: baseurl,
  transformRequest: [function (data, headers) {
    headers['Authorization'] = auth()
    return JSON.stringify(data)
  }],
  headers: {
    'Content-Type': 'application/json'
  }
})

이λ₯Ό μœ„ν•΄ 인터셉터 λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μš”μ²­μ˜ κΈ°λ³Έ URL이 λ‚΄ API인 경우 인증 헀더λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€(자격 증λͺ…을 제3μžμ—κ²Œ λ³΄λ‚΄λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄). 이것은 각 μš”μ²­μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ 토큰이 λ³€κ²½λ˜λ©΄(예: 토큰 μƒˆλ‘œ 고침의 결과둜) λ‹€μŒ μš”μ²­μ—μ„œ μƒˆ 토큰을 μ„ νƒν•©λ‹ˆλ‹€. λ˜ν•œ μ–΄λ–€ μ΄μœ λ‘œλ“  ν•„μš”ν•œ 경우 호좜 μ‚¬μ΄νŠΈμ—μ„œ 헀더λ₯Ό μž¬μ •μ˜ν•  수 μžˆλ„λ‘ μš”μ²­μ—μ„œ κΈ°μ‘΄ 값을 ν™•μΈν•©λ‹ˆλ‹€.

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

@mattstrayer getToken() λ©”μ„œλ“œλ₯Ό 보여 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? 토큰을 localStorage λ˜λŠ” AsyncStorage(React Native)에 μ €μž₯ν•©λ‹ˆκΉŒ? 미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

λ‚˜λŠ” μ΄κ²ƒμœΌλ‘œ 끝났닀.

axios.create({
  baseURL: '<your-api>',
  headers: {
    Authorization: {
      toString () {
        return `Bearer ${localStorage.getItem('token')}`
      }
    }
  }
})

μ–΄λ–€ κ²½μš°μ—λ„ μž‘λ™ν•˜λŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚΄ http.js 파일:

import axios from 'axios';
import {store} from './store';

const http = axios.create ({
  baseURL: process.env.VUE_APP_ROOT_API,
  timeout: 1000,
  headers: {'Content-Type': 'application/json'},
});

http.interceptors.request.use (
  function (config) {
    const token = store.token;
    if (token) config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  function (error) {
    return Promise.reject (error);
  }
);

export default http;

λ‚΄ 상점, κ°„λ‹¨ν•œ get/set "class"

export const store = {
    _username: '',
    _email: '',
    _token: '',

    isLogged () {
      return this.token
    },

    set username (str) {
      this._username = str
      localStorage.setItem('username',str)
    },
    get username () {
      return this._username || localStorage.getItem('username')
    },

    set email (str) {
      this._email = str
      localStorage.setItem('email',str)
    },
    get email () {
      return this._email || localStorage.getItem('email')
    },

    set token (str) {
      this._token = str
      localStorage.setItem('token',str)
    },
    get token () {
      return this._token || localStorage.getItem('token')
    }

  }

λ‚΄ μ‚¬μš©μž μ„œλΉ„μŠ€ "클래슀":

import http from './http'

export const user = {
  ping: () => http.get('/users/ping'),
  save: (user) => http.post('/users', user)
}

λ§ˆμ§€λ§‰μœΌλ‘œ λ‚΄ κ΅¬ν˜„ :

import {user} from '@/services'

 user.ping().then( r => {
      console.log(r.data)
    })

btw, process.env.VUE_APP_ROOT_API 및 @/services λŠ” Vueμž…λ‹ˆλ‹€...

κ²°κ³Ό:
image

@danielschmitz κ·Έ μ˜ˆμ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!!

μ—¬λŸ¬λΆ„ λͺ¨λ‘κ°€ 이것을 μ•Œμ•„ λƒˆκ³  버그가 μ•„λ‹Œ 것 κ°™μ•„μ„œ 이것을 λ‹«μŠ΅λ‹ˆλ‹€ πŸ™‚

API 호좜이 트리거되기 전에 λ‚΄ 토큰이 μ„€μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ 인터셉터λ₯Ό async/await둜 λž˜ν•‘ν•˜λŠ” 것이 μœ μš©ν•˜λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

http.interceptors.request.use (
  async (config) => {
    const token = await getToken(); // slightly longer running function than example above
    if (token) config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  (error) => {
    return Promise.reject (error);
  }
);

이λ₯Ό μœ„ν•΄ 인터셉터 λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μš”μ²­μ˜ κΈ°λ³Έ URL이 λ‚΄ API인 경우 인증 헀더λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€(자격 증λͺ…을 제3μžμ—κ²Œ λ³΄λ‚΄λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄). 이것은 각 μš”μ²­μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ 토큰이 λ³€κ²½λ˜λ©΄(예: 토큰 μƒˆλ‘œ 고침의 결과둜) λ‹€μŒ μš”μ²­μ—μ„œ μƒˆ 토큰을 μ„ νƒν•©λ‹ˆλ‹€. λ˜ν•œ μ–΄λ–€ μ΄μœ λ‘œλ“  ν•„μš”ν•œ 경우 호좜 μ‚¬μ΄νŠΈμ—μ„œ 헀더λ₯Ό μž¬μ •μ˜ν•  수 μžˆλ„λ‘ μš”μ²­μ—μ„œ κΈ°μ‘΄ 값을 ν™•μΈν•©λ‹ˆλ‹€.

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

μΈν„°μ…‰ν„°λŠ” κ°€μž₯ μš°μ•„ν•œ μ†”λ£¨μ…˜μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰