191111 TIL bearer token, qna구현(미션2)
Nov 11, 2019
»
1.5막,
TIL (Today I Learned)
bearer token
로그인을 구현하다가, jwt를 써보게됐고, 인증을 유지하는 방법을 찾아봤다.
위 글들을 참고했고, 지금까지 파악한 바로는,
-
로그인 post시 헤더에 authorization 넣어준다.
headers: {'Authorization': "bearer " + token}혹은axios.defaults.headers.common = {'Authorization':Bearer ${token}} -
모든 js 파일 상단에서 토큰 유효성을 확인한다…?
if(typeof axios !== "undefined") axios.defaults.withCredentials = true;
qna구현(미션2)
마침 또 과제에서 jwt 사용하는 내용이 나와서 복습..
조건은 async await 쓰지 않고 fetch로만 구현.
//Component
function QNA() {
const [qnaList, setQnAList] = Plain.useState([]);
//login 과정도 useState로 구현할 수 있음 -> 하지만 난 못했찌.
//const [loginId, setLoginId] = Plain.useState(null);
function renderQnA(data) {
const target = $(".qna-wrap");
const resultHTML = getQnATemplate(data);
target.innerHTML = resultHTML;
}
async function initRender(callback) {
try {
const res = await fetch(URL.INIT);
const result = await res.json();
setQnAList(data => result.list || data);
} catch (err) {
console.error("render fetching error");
}
}
return {
render() {
if (qnaList.length > 0) renderQnA(qnaList)
},
initComponent() {
initRender(() => {
console.log("init render end")
})
}
};
}
document.addEventListener("DOMContentLoaded", () => {
let qnaService = Plain.renderComponent(QNA);
qnaService.initComponent();
const token = localStorage.getItem('token')
if (token) isTokenValid(token) ? qnaService.initComponent() : '';
$('.login-btn').addEventListener("click", () => $('.login-btn').innerText === '로그인' ? getLogin() : getLogout())
});
const getLogin = () => {
const fetchData = {
user: 'soom'
};
let isSuccess = false;
fetch(URL.LOGIN, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(fetchData),
})
.then(response => response.json())
.then(data => {
if (data.auth) {
console.log(data.message, '로그인 되셨습니당...');
localStorage.setItem('token', data.token);
localStorage.setItem('username', fetchData.user);
isSuccess = !isSuccess;
} else {
console.log('login: error')
}
}).then(() => {
if (isSuccess) {
const userName = localStorage.getItem('username');
$('.login-btn').innerText = userName;
}
})
.catch(e => console.log(e));
}
const getLogout = () => {
localStorage.clear();
$('.login-btn').innerText = "로그인";
console.log('로그아웃 되셨습니당...')
}
const isTokenValid = () => {
fetch("/api/token-validation", {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${localStorage.getItem('token')}`
}
})
.then(response => response.json())
.then(data => {
if (data.authResult) {
localStorage.setItem('username', data.id)
return true;
} else {
console.log('token-validation: error');
return false;
}
})
.catch(e => console.log(e))
}