๐ฏ ํ์ต ๋ชฉํ
- Vuex
auth
๋ชจ๋์login
action์ ์ถ๊ฐํ๋ค - ์ปดํฌ๋ํธ(
Login.vue
)์์๋this.$store.dispatch()
๋ง ํธ์ถํ๋๋ก ๊ฐ์ํ - API ์๋ต ์ฒ๋ฆฌ, ์ํ ๋ณ๊ฒฝ, ์๋ฌ ์ฒ๋ฆฌ ๋ฑ์ ๋ชจ๋ ๋ด๋ถ์์ ์ฒ๋ฆฌ
โ
1๋จ๊ณ: auth.js
๋ชจ๋์ actions
์ถ๊ฐ
// store/modules/auth.js
import axios from 'axios';
import { isTokenExpired } from '@/utils/jwt';
const state = {
isLoggedIn: false,
username: localStorage.getItem('username') || '',
};
const mutations = {
setToken(state, token) {
localStorage.setItem('token', token);
state.isLoggedIn = true;
},
setUsername(state, name) {
localStorage.setItem('username', name);
state.username = name;
},
logout(state) {
localStorage.removeItem('token');
localStorage.removeItem('username');
state.isLoggedIn = false;
state.username = '';
},
syncLoginState(state) {
const token = localStorage.getItem('token');
const name = localStorage.getItem('username');
if (!token || isTokenExpired(token)) {
localStorage.removeItem('token');
localStorage.removeItem('username');
state.isLoggedIn = false;
state.username = '';
} else {
state.isLoggedIn = true;
state.username = name || '';
}
},
};
const actions = {
async login({ commit }, { username, password }) {
try {
const res = await axios.post('/api/auth/login', {
username,
password,
});
commit('setToken', res.data.token);
commit('setUsername', res.data.username);
return { success: true };
} catch (error) {
return {
success: false,
message: error.response?.data?.message || '๋ก๊ทธ์ธ ์คํจ',
};
}
},
};
export default {
namespaced: true,
state,
mutations,
actions,
};
โ
2๋จ๊ณ: Login.vue
์์ Vuex action ์ฌ์ฉ
๐ง ๋ณ๊ฒฝ ์
const res = await axios.post('/api/auth/login', { ... });
localStorage.setItem('token', res.data.token);
localStorage.setItem('username', res.data.username);
๐ง ๋ณ๊ฒฝ ํ
const result = await this.$store.dispatch('auth/login', {
username: this.username,
password: this.password,
});
if (result.success) {
this.$router.push('/todos');
} else {
alert(result.message);
}
โ
3๋จ๊ณ: ์ต์ข
Login.vue
์ฝ๋ ์์
<script>
export default {
name: 'LoginPage',
data() {
return { username: '', password: '' };
},
methods: {
async handleLogin() {
try {
const result = await this.$store.dispatch('auth/login', {
username: this.username,
password: this.password,
});
if (result.success) {
this.$router.push('/todos');
} else {
alert(result.message);
}
} catch (e) {
alert('๋ก๊ทธ์ธ ์คํจ');
}
},
},
};
</script>
๐ฆ ์์ฝ
์ด ๊ฐ์์์๋ ๋ก๊ทธ์ธ API ํธ์ถ๊ณผ ์ํ ์ฒ๋ฆฌ๋ฅผ Vuex auth ๋ชจ๋์ actions๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ๋จํ๊ณ ์ญํ ์ด ๋ถ๋ฆฌ๋ ๊ตฌ์กฐ๋ก ๊ฐ์ ๋์๋ค.
๐ฌ ๋๊ธ
โป ๋ก๊ทธ์ธ ํ ๋๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.