[Nuxt Admin] 6. Nuxt에서 로그인 처리
[ Nuxt Admin Template 6 ]
Nuxt에서 Express로 로그인 처리
12. Nuxt에서 로그인 처리
우선 로그인 페이지와 레이아웃를 만들어주자
layouts/loginLayout.vue
<template>
<v-content>
<nuxt />
</v-content>
</template>
pages/v1/login/index.vue
<template>
<v-app id="inspire">
<v-content>
<v-container fluid fill-height>
<v-layout align-center justify-center>
<v-flex xs12 sm8 md4>
<v-card class="elevation-12">
<v-form @submit.prevent>
<v-toolbar dark color="primary">
<v-toolbar-title>관리자 로그인</v-toolbar-title>
<v-spacer></v-spacer>
</v-toolbar>
<v-card-text>
<v-text-field prepend-icon="person" id="id" name="id" label="id" type="text" v-model="frmId"></v-text-field>
<v-text-field prepend-icon="lock" id="pw" name="pw" label="pw" type="password" v-model="frmPw"></v-text-field>
</v-card-text>
<p v-if="returnMsg" class="error">
{ { returnMsg } }
</p>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" @click="login">
로그인
</v-btn>
</v-card-actions>
</v-form>
</v-card>
</v-flex>
</v-layout>
</v-container>
</v-content>
</v-app>
</template>
<script>
export default {
layout: 'loginLayout',
data () {
return {
returnMsg: null,
frmId: '',
frmPw: ''
}
},
methods: {
async login () {
try {
await this.$store.dispatch('login', {
id: this.frmId,
pw: this.frmPw
}).then(() => this.redirect())
} catch (e) {
this.returnMsg = e.message
}
},
redirect () {
this.$router.push('/')
}
}
}
</script>
필요한 패키지들을 설치하고
$ npm install @nuxtjs/axios --save-dev
$ npm install express-session express body-parser --save-dev
express를 이용해서 로그인처리를 할 예정이기에 nuxt.config.js 파일에 추가해주고, apis/index.js 파일을 만들어준다.
nuxt.config.js (생략된 코드)
//express로 개발하기에 추가
import bodyParser from 'body-parser'
import session from 'express-session'
module.exports = {
// 미들웨어에 접근인증을 위해 추가
router: {
middleware: 'auth'
},
// axios 모듈 추가
modules: [
'@nuxtjs/axios'
],
/*
** Add server middleware
** Nuxt.js uses `connect` module as server
** So most of express middleware works with nuxt.js server middleware
*/
serverMiddleware: [
// body-parser middleware
bodyParser.json(),
// session middleware
session({
secret: 'super-secret-key',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 60000 }
}),
// Api middleware
// We add /api/login & /api/logout routes
'~/apis'
]
}
서버 인증api 역할을 하기 위해
apis/index.js
import express from 'express'
// Create express router
const router = express.Router()
const app = express()
router.use((req, res, next) => {
Object.setPrototypeOf(req, app.request);
Object.setPrototypeOf(res, app.response);
req.res = res;
res.req = req;
next();
});
router.post('/login', (req, res) => {
if (req.body.id === 'admin' && req.body.pw === 'a00000') {
req.session.authUser = req.body.id
return res.json({ id: 'admin' });
}
return res.json({ id: '' });
});
router.post('/logout', (req, res) => {
delete req.session.authUser;
res.json({ ok: true });
});
// Export the server middleware
export default {
path: '/apis',
handler: router
};
store/index.js
import axios from 'axios'
export const state = () => ({
sidebar: false,
authUser: null
})
export const mutations = {
toggleSidebar: function (state) {
state.sidebar = !state.sidebar
},
LOGIN: function (state, user) {
state.authUser = user
},
LOGOUT: function () {
state.authUser = null
},
SET_USER: function (state, user) {
state.authUser = user
},
SET_MENU: function (state, data) {
state.topMenu = data.topMenu
state.aside = data.aside
}
}
export const actions = {
// nuxtServerInit는 모든 페이지를 서버 렌더링하기 전에 Nuxt.js에 의해 호출
async nuxtServerInit({ commit }, { req }) {
if (req.session && req.session.authUser) {
commit('SET_USER', req.session.authUser)
}
},
async login({ commit }, { id, pw }) {
let { data } = await axios.post('/apis/login', { id, pw })
if (!data.id) {
throw new Error('로그인에 실패했습니다.')
}
commit('LOGIN', data.id)
},
async logout({ commit }) {
await axios.post('/apis/logout').then(() => commit('LOGOUT'))
}
}
페이지 이동시 인증되지 않은 접근을 막기 위해 추가
middleware/auth.js
export default function ({ store, redirect, error }) {
// auth 확인
if (!store.state.authUser) {
return redirect('/v1/login')
}
}
Nuxt에서 기본적인 로그인 인증방식을 포스팅을 해봤다. 하나씩 하나씩 가볍게 살 좀 더 붙여보겠습니다.
참고