로그인 로직
동아리연합회와 협업 프로젝트를 진행하고 있고 그 중 로그인 부분을 진행하고 있다.
이번 로그인은 몇가지 조건이 있다.
- 동아리 사람들만 로그인할 수 있다. (동아리 소속 아닌 사람들은 로그인 자체가 안됨)
- 처음 로그인 하는 동아리원들은 동의 수집 페이지를 거쳐야 한다.
위의 항목들을 만족하지 않으면 에러로 돌아오고 에러 처리를 해줘야 한다.
정리해보면,
로그인 시도(/login)를 했을 때
- 동아리원O, 동의O -> 로그인 성공(200) -> 메인으로 이동
- 동아리원O, 동의X -> 401 에러 -> 동의 항목 페이지로 이동 -> 동의하기(/agree) -> 로그인 재시도(/login) -> 로그인 성공(200)
- 동아리원X -> 400 에러 -> 로그인 불가능
// 로그인
const handleLogin = async () => {
try {
console.log(studentInfo)
const result = await API().post('/login', studentInfo); // 로그인 성공
console.log(result);
navigate('/user'); // 사용자 메인으로 이동
} catch (error) {
if (error.response) {
const statusCode = error.response.status;
if (statusCode === 400) { // 400 : 학번 or 이름 틀렸을 경우
setFailModalOpen(!failModalOpen);
setStudentInfo({
studentId: '',
name: ''
});
} else { // 401 : 개인정보 동의하지 않았을 경우
setModalOpen(!modalOpen);
}
}
}
};
로그인을 성공했을 때는 navigate로 페이지를 이동 시켜주고
실패했을 때는 에러 코드에 따라 다른 처리를 해주었다.
에러코드 === 400 > 동아리 소속이 아닌사람 (동아리원X)
해당 창이 뜨면서 로그인 실패
에러코드 === 401 > 동아리 소속이지만 동의항목을 거치지 않은 사람(동아리원O, 동의X)
개인정보 수집이용 동의 모달창을 띄워준다.
이후 모달창에서 동의를 누르면 서버(/agree)로 동아리원 정보가 전달되고 서버에서 전달받은 동아리원의 isAgree 항목을 true로 변경함.
// 동의했을 때
const handleAgree = async () => {
try {
await API().post('/agree', studentInfo); // 성공적으로 처리되면
handleLogin(studentInfo); // 다시 로그인 함수 호출
} catch (error) {
console.log(error)
}
}
이후 다시 로그인 재시도(/login)를 하면 동아리원O, 동의O 이므로 로그인 성공(200) !
로그인 성공시 돌아온 토큰 저장
const result = await API().post('/login', studentInfo); // 로그인 성공
navigate('/user'); // 사용자 메인으로 이동
localStorage.clear()
localStorage.setItem('Token', result.data.accessToken)
로그인을 성공하게 되면 서버에서 토큰을 발행해주는데 이 토큰을 어딘가에 저장해두어야 한다.
일반적으로 발행된 토큰은 로컬 스토리지에 저장된다.
localStorage.clear()로 한번 비워주고,
localStorage.setItem(키, 값)의 형태로 돌아온 토큰을 저장하면
잘 저장되는 것을 볼 수 있다 ! 야호
'Web > React' 카테고리의 다른 글
React axios 통신 DELETE 메서드 400 에러 (0) | 2024.04.08 |
---|---|
React 로그인 상태 전역으로 관리하기(useContext) (0) | 2024.04.07 |
React, RN 프로젝트 시작 명령어 (1) | 2024.04.01 |
[React] 리액트 라우팅 URL 경로 분리 (0) | 2024.03.12 |
[React] 파일 구조 정리 및 이해 (0) | 2024.01.11 |