[Vue.js] 토큰 기반 인증 catch 사용 (#6. 에러 처리)
하수도키
·2020. 10. 31. 11:13
728x90
반응형
SMALL
2020/10/31 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증 (#7. 자동 로그인)
2020/10/31 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증 catch 사용 (#6. 에러 처리)
2020/10/30 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증(#5. 유저 로그아웃)
2020/10/28 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증(#4. 유저 로그인)
2020/08/30 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증(#3. 사용자 등록)
2020/07/27 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증(#2. 인증을 위한 프로젝트 구조 살피기)
2020/07/24 - [개발일기/Vue.js] - [Vue.js] 토큰 기반 인증(#1. 인증소개)
[Vue.js] 토큰 기반 인증(#6. 에러 처리)
개요
- 사용자 가입(register), 로그인(login)시 발생하는 에러에 대해 다룬다.
- 유효하지 않은 자격(credentials)를 입력(예를 들면, 잘못된 비밀번호)할 경우 - 로그인시
- 사용자가 가입할때(이미 등록된 이메일, 유효하지 않은 비밀번호 규칙) - 가입시
서버단 이해하기
- 서버에서 어떻게 동작하는지 알면 프론트엔드 Vue에서 알맞게 대처가 가능하다.
- 서버에서 사용자의 credentials이 DB에 저장된 정보인지 확인해야 된다.
- 하지만, 우리는 Mock Data Server이므로 1개의 정보가 저장되어있으므로, 확인하기가 쉽다.
- 만약 확인이 되지 않는 credentials이면 401 상태 코드를 반환해준다.
server /login
endpoint
app.post('/login', (req, res) => {
const userDB = fs.readFileSync('./db/user.json') // db 읽기
const userInfo = JSON.parse(userDB)
if ( // db에 사용자 정보가 있는지 확인
req.body &&
req.body.email === userInfo.email &&
req.body.password === userInfo.password
) {
const token = jwt.sign({ userInfo }, 'the_secret_key')
res.json({
token,
email: userInfo.email,
name: userInfo.name
})
} else {
res.status(401).json({ error: 'Invalid login. Please try again.'}) // 사용자 정보가 없으면 에러를 보내준다.
}
})
server /register
endpoint
- 같은 이메일로 여러개 중복 가입은 할 수 없다.
- 비밀번호 규칙을 만들어 보안을 높힌다.
- 실제 서비스에서는 validation libarary를 사용하여 비밀번호 규칙을 만들지만, 여기서는 간단하게 작업을 한다.
app.post('/register', (req, res) => {
...
const errorsToSend = [] // 에러 수집하는 배열
if (dbUserEmail === user.email) { // db에 이메일 있는지 확인
errorsToSend.push('An account with this email already exists.')
}
if (user.password.length < 5) { // 비밀번호 규칙에 맞는지 확인
errorsToSend.push('Password too short.')
}
if (errorsToSend.length > 0) { // 에러가 있는지 확인
res.status(400).json({ errors: errorsToSend }) // 에러가 있으면 보내준다
} else {
// 성공 로직
}
...
})
- 이제 서버에서 할일을 다 체크했으니 Vue app에서 에러를 다루는 법을 살펴보자
로그인(login) 에러 다루기
LoginUser
컴포넌트에 에러를 잡는catch
를 추가한다.error
data property를 만든다.
src/views/LoginUser.vue
<template>
...
<p>{{ error }}</p>
...
</template>
<script>
data () {
return {
...
error: null
}
},
methods: {
login () {
this.$store
.dispatch('login', {
email: this.email,
password: this.password
})
.then(() => {
this.$router.push({ name: 'dashboard' })
})
.catch(err =>
this.error = err.response.data.error
})
}
}
</script>
가입(register) 에러 다루기
- 로그인 에러랑 똑같다.
- 대신 에러가 2개 발생할 수 있으니
v-for
를 이용해 보여주자.
src/views/RegisterUser.vue
<template>
...
<ul>
<li v-for="(error, index) in errors" :key="index">
{{ error }}
</li>
</ul>
...
</template>
<script>
export default {
data () {
return {
...
errors: null
}
},
methods: {
register () {
...
.catch(err => {
this.errors = err.response.data.errors
})
}
}
}
</script>
결론
catch
를 사용해 에러를 잡아내서 화면에 보여줬다.- 서버에서 validation 처리를 했지만 클라이언트에서도 가능하다.
- 다음에는 자동 로그인에 대해 알아보겠다.
728x90
반응형
LIST
'개발일기 > Vue.js' 카테고리의 다른 글
[Vue.js] textarea 자동 높이 조절 하는법(autosize) (0) | 2020.11.02 |
---|---|
[Vue.js] 토큰 기반 인증 (#7. 자동 로그인) (0) | 2020.10.31 |
[Vue.js] 토큰 기반 인증(#5. 유저 로그아웃) (0) | 2020.10.30 |
[Vue.js] 토큰 기반 인증(#4. 유저 로그인) (0) | 2020.10.28 |
Vue.Js 3 Composition API 살펴보기 - 5(Teleport) (0) | 2020.10.28 |