191111 TIL bearer token, qna구현(미션2)

» 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))
}