μλ νμΈμ μ¬λ¬λΆ,
보νΈλ API 리μμ€μ μ¬μ©νλ axiosμ μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ ν ν°μ΄ μλ auth ν€λλ₯Ό 첨λΆνμ§λ§ λ¬Έμ λ μ½μλ‘ μ΄λνμ¬ localStorageμμ tokemμ μμ ν΄λ axiosκ° μ¬μ ν μΈμ€ν΄μ€λ‘ μ μ‘νλ€λ κ²μ λλ€. μ λ°μ΄νΈλμ§ μμμ΅λλ€.
μΈμ€ν΄μ€μ μΈμ¦ ν€λκ° λͺ¨λ μμ²μμ localStorageμ ν ν°μ νμΈν μ μλ μ루μ μ΄ μμ΅λκΉ?
κ°μ¬ ν΄μ!
μ λ¬λ ν€λκ° λͺ¨λ μμ²μ ββλν΄ λλ¦¬κ² νκ°λλ€λ©΄ μ’μ μ μ¬ν μ¬μ© μ¬λ‘κ° μμ΅λλ€.
μκ°:
ν€λ ν΄μλ₯Ό κ°μ²΄( 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μ λλ€...
κ²°κ³Ό:
@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) );
μΈν°μ ν°λ κ°μ₯ μ°μν μ루μ μ²λΌ 보μ λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄λ₯Ό μν΄ μΈν°μ ν° λ₯Ό μ¬μ©νμ΅λλ€. μμ²μ κΈ°λ³Έ URLμ΄ λ΄ APIμΈ κ²½μ° μΈμ¦ ν€λλ₯Ό μΆκ°ν©λλ€(μ격 μ¦λͺ μ μ 3μμκ² λ³΄λ΄λ κ²μ λ°©μ§νκΈ° μν΄). μ΄κ²μ κ° μμ²μμ μ€νλλ―λ‘ ν ν°μ΄ λ³κ²½λλ©΄(μ: ν ν° μλ‘ κ³ μΉ¨μ κ²°κ³Όλ‘) λ€μ μμ²μμ μ ν ν°μ μ νν©λλ€. λν μ΄λ€ μ΄μ λ‘λ νμν κ²½μ° νΈμΆ μ¬μ΄νΈμμ ν€λλ₯Ό μ¬μ μν μ μλλ‘ μμ²μμ κΈ°μ‘΄ κ°μ νμΈν©λλ€.