Store_Vuex init...

This commit is contained in:
최준흠 2022-09-10 19:50:25 +09:00
parent f4bc08d851
commit 83b7b68897
6 changed files with 96 additions and 87 deletions

11
package-lock.json generated
View File

@ -14,6 +14,7 @@
"core-js": "^3.8.3", "core-js": "^3.8.3",
"vee-validate": "^3.4.14", "vee-validate": "^3.4.14",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-cookies": "^1.8.1",
"vue-router": "^3.5.1", "vue-router": "^3.5.1",
"vue2-editor": "^2.10.3", "vue2-editor": "^2.10.3",
"vuex": "^3.6.2" "vuex": "^3.6.2"
@ -10643,6 +10644,11 @@
"csstype": "^3.1.0" "csstype": "^3.1.0"
} }
}, },
"node_modules/vue-cookies": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.8.1.tgz",
"integrity": "sha512-PDq1EaiRRyau5PBQVscXboHW+iWtcG4wRY2UKIz1j0nrjb3KESRU1PUyNUDdOajAwy4RH1IfiNR0suhWRXQdrA=="
},
"node_modules/vue-eslint-parser": { "node_modules/vue-eslint-parser": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
@ -19485,6 +19491,11 @@
"csstype": "^3.1.0" "csstype": "^3.1.0"
} }
}, },
"vue-cookies": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.8.1.tgz",
"integrity": "sha512-PDq1EaiRRyau5PBQVscXboHW+iWtcG4wRY2UKIz1j0nrjb3KESRU1PUyNUDdOajAwy4RH1IfiNR0suhWRXQdrA=="
},
"vue-eslint-parser": { "vue-eslint-parser": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",

View File

@ -14,6 +14,7 @@
"core-js": "^3.8.3", "core-js": "^3.8.3",
"vee-validate": "^3.4.14", "vee-validate": "^3.4.14",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-cookies": "^1.8.1",
"vue-router": "^3.5.1", "vue-router": "^3.5.1",
"vue2-editor": "^2.10.3", "vue2-editor": "^2.10.3",
"vuex": "^3.6.2" "vuex": "^3.6.2"

View File

@ -82,10 +82,10 @@ export default {
async onSubmit() { async onSubmit() {
try { try {
//1. //1.
const accessToken = await this.getAccessToken() const tokens = await this.getTokens()
//2. BackEnd //2. BackEnd
//console.log(accessToken) //console.log(tokens)
await this.sendAccessToken(accessToken) await this.sendAccessToken(tokens)
//3.next //3.next
const return_url = this.$route.params.return_url || 'home' const return_url = this.$route.params.return_url || 'home'
alert('로그인 성공..\n' + return_url) alert('로그인 성공..\n' + return_url)
@ -96,7 +96,7 @@ export default {
alert('로그인 실패...\n' + message) alert('로그인 실패...\n' + message)
} }
}, },
async getAccessToken() { async getTokens() {
return await this.$store return await this.$store
.dispatch('AuthStore/login', { .dispatch('AuthStore/login', {
email: this.form.email, email: this.form.email,
@ -105,15 +105,15 @@ export default {
.then((response) => { .then((response) => {
//console.log(response) //console.log(response)
//alert(' ..') //alert(' ..')
return response.data.access_token return response.data.tokens
}) })
.catch((e) => { .catch((e) => {
throw new Error('인증서버에서 인증코드 받기 실패..\n' + e.message) throw new Error('인증서버에서 인증코드 받기 실패..\n' + e.message)
}) })
}, },
async sendAccessToken(accessToken) { async sendTokens(tokens) {
return await this.$store return await this.$store
.dispatch('TodoStore/sendAccessToken', accessToken) .dispatch('TodoStore/sendTokens', tokens)
.then((response) => { .then((response) => {
console.log(response) console.log(response)
alert('인증코드 전송 성공..') alert('인증코드 전송 성공..')

View File

@ -1,6 +1,5 @@
import axios from 'axios' import axios from 'axios'
import jwt from './jwt' import jwt from './jwt'
//참조: https://yamoo9.github.io/axios/guide/interceptors.html //참조: https://yamoo9.github.io/axios/guide/interceptors.html
const apiServer = axios.create({ const apiServer = axios.create({
baseURL: process.env.VUE_APP_AUTH_HOST, baseURL: process.env.VUE_APP_AUTH_HOST,
@ -13,19 +12,24 @@ apiServer.interceptors.request.use(
Promise.reject(error) Promise.reject(error)
} }
) )
apiServer.defaults.headers.post['Content-Type'] = apiServer.defaults.headers.post['Content-Type'] =
'application/x-www-form-urlencoded' 'application/x-www-form-urlencoded'
// count state 속성 추가 // count state 속성 추가
const state = { const state = {
token: { tokens: {
accessToken: jwt.getToken() access_token: jwt.getToken(),
refresh_token: jwt.getToken('refresh_token')
}, // 토큰정보 }, // 토큰정보
isAuthenticated: jwt.isAuthenticated() isAuthenticated: jwt.isAuthenticated()
} }
const getters = { const getters = {
getAccessToken: function (state) { getAccessToken: function (state) {
return state.token.accessToken return state.tokens.access_token
},
getRefreshToken: function (state) {
return state.tokens.refresh_token
}, },
isAuthenticated: function (state) { isAuthenticated: function (state) {
return state.isAuthenticated return state.isAuthenticated
@ -33,65 +37,57 @@ const getters = {
} }
const mutations = { const mutations = {
login: function (state, payload = {}) { login: function (state, payload = {}) {
state.token.accessToken = payload.accessToken state.tokens = payload.tokens
state.isAuthenticated = true state.isAuthenticated = true
jwt.saveToken(payload.accessToken) jwt.saveToken('acccess_token', payload.tokens.access_token)
jwt.saveToken('refresh_token', payload.tokens.refresh_token)
}, },
logout: function (state) { logout: function (state) {
state.token.accessToken = '' state.tokens = {}
state.isAuthenticated = false state.isAuthenticated = false
jwt.destroyToken() jwt.destroyToken()
} }
} }
const actions = { const actions = {
login: function (context, payload) { login: async function (context, payload) {
let params = { const params = {
email: payload.email, email: payload.email,
password: payload.password password: payload.password
} }
return new Promise((resolve, reject) => { return await apiServer
apiServer .post('/auth/login', params)
.post('/auth/login', params) .then((response) => {
.then((response) => { const { data } = response
const { data } = response context.commit('login', {
context.commit('login', { tokens: data.tokens
accessToken: data.accessToken
})
resolve(response)
}) })
.catch((error) => { return response
reject(error) })
}) .catch((error) => {
}) return error
})
}, },
logout: function (context, payload) { logout: async function (context, payload) {
return new Promise((resolve) => { return await context.commit('logout', payload)
setTimeout(function () {
context.commit('logout', payload)
resolve({})
}, 1000)
})
}, },
register: function (context, payload) { register: async function (context, payload) {
let params = { const params = {
email: payload.email, email: payload.email,
password: payload.password, password: payload.password,
name: payload.name name: payload.name
} }
return new Promise((resolve, reject) => { return await apiServer
apiServer .post('/auth/register', params)
.post('/auth/register', params) .then((response) => {
.then((response) => { const { data } = response
const { data } = response context.commit('login', {
context.commit('login', { tokens: data.tokens
accessToken: data.accessToken
})
resolve(response)
}) })
.catch((error) => { return response
reject(error) })
}) .catch((error) => {
}) return error
})
} }
} }
export default { namespaced: true, state, getters, mutations, actions } export default { namespaced: true, state, getters, mutations, actions }

View File

@ -1,22 +1,27 @@
const Payload_KEY_NAME = 'access_token' //import VueCookies from 'vue-cookies'
const getToken = () => { //import jsonwebtoken from 'jsonwebtoken'
document.cookie.g
return window.localStorage.getItem(Payload_KEY_NAME) const getToken = (key = 'access_token') => {
return window.localStorage.getItem(key)
//return VueCookies.get(Payload_KEY_NAME)
} }
const saveToken = (token) => { const saveToken = (key, value) => {
window.localStorage.setItem(Payload_KEY_NAME, token) window.localStorage.setItem(key, value)
} }
const destroyToken = () => { const destroyToken = (key) => {
window.localStorage.removeItem(Payload_KEY_NAME) window.localStorage.removeItem(key)
} }
// const decodeToken = (key) => {
// return jsonwebtoken.decode(getToken(key))
// }
const isAuthenticated = () => { const isAuthenticated = () => {
return !!getToken() return !!getToken()
} }
const getAuthorizationHeader = (config) => { const getAuthorizationHeader = (config) => {
//로그인이 되었는지 확인후 Request시 헤더에 로그인정보 추가하기 위함 //로그인이 되었는지 확인후 Request시 헤더에 로그인정보 추가하기 위함
if (isAuthenticated) { if (isAuthenticated) {
config.headers.common['Authorization'] = getToken() config.headers.common['access_token'] = getToken('access_token')
config.headers.common['refresh_token'] = getToken('refresh_token')
} }
return config return config
} }

View File

@ -36,36 +36,32 @@ const mutations = {
} }
} }
const actions = { const actions = {
sendAccessToken: function (context, accessToken) { sendAccessToken: async function (context, accessToken) {
//주의 .get의 parameter는 { params: params} 처럼 보내야함 //주의 .get의 parameter는 { params: params} 처럼 보내야함
return new Promise((resolve, reject) => { return await apiServer
apiServer .get('/todo/accessToken', { params: accessToken })
.get('/todo/accessToken', { params: accessToken }) .then((response) => {
.then((response) => { const { data } = response
const { data } = response context.commit('setData', data)
context.commit('setData', data) return response
resolve(response) })
}) .catch((error) => {
.catch((error) => { return error
reject(error) })
})
})
}, },
setData: function (context, params) { setData: async function (context, params) {
console.log(params) console.log(params)
//주의 .get의 parameter는 { params: params} 처럼 보내야함 //주의 .get의 parameter는 { params: params} 처럼 보내야함
return new Promise((resolve, reject) => { return await apiServer
apiServer .get('/todo', { params: params })
.get('/todo', { params: params }) .then((response) => {
.then((response) => { const { data } = response
const { data } = response context.commit('setData', data)
context.commit('setData', data) return response
resolve(response) })
}) .catch((error) => {
.catch((error) => { return error
reject(error) })
})
})
} }
} }
export default { namespaced: true, state, getters, mutations, actions } export default { namespaced: true, state, getters, mutations, actions }