vue-admin-template 的專案已經放置在 nginx 之後我們就要把api跟後台前端的部分進行串接了,那麼首先要設定的就是登入頁面的串接囉,登入之後就可以獲得權限進行各個頁面的使用。那麼登入實際上該做什麼呢?
講到login這個部分,礙於篇幅(因為也只剩下兩天了),所以我們就跳過一些說明了,我們採用的是server side 以 session 來驗證使用者的登入是否正確,那麼我們應該在api跟後台前端要怎麼配置呢?
首先呢express中我們必須在路由的前段就引入session的中間件,express有提供一個好用的session給我們使用,express-session
一樣我們透過npm來進行安裝。
npm i express-session
接著我們在code裡面添加進去,由於我這邊想要將session的資料記錄在redis中(相較起來比較直觀和好控管)express-session
一樣有提供好用的方是可以達成這個任務。
const session = require('express-session');
const RedisStore = connectRedis(session);
....
....
app.use(
session({
secret: config.sessionSecret,
resave: false,
saveUninitialized: true,
cookie: {
secure: false, // if true only transmit cookie over https
httpOnly: false, // if true prevent client side JS from reading the cookie
maxAge: 1000 * 60 * 10, // session max age in miliseconds
},
store: new RedisStore({ client: dbHelper.redisClient }),
})
);
並且我們需要新增一個login
路由來供我們後台前端使用讓我們的登入資訊能夠寫入到這個session之中
const express = require('express');
const router = express.Router();
const loginService = require('../service/login');
const utils = require('../../utils/utils');
const asyncHandler = require('express-async-handler');
const SuccessResponse = require('../../base/responseHander').SuccessResponse;
var signature = require('cookie-signature');
const config = require('../../config');
const filter = require('../middleware/filter');
const errorHandler = require('../../base/errorHandler');
router.post(
'/login',
asyncHandler(async function (req, res) {
const body = req.body;
let login = await loginService.login(body);
if (login.isSucceed) {
req.session.login = true; //设置session
req.session.account = login.account; //设置session
req.session.cookie.expires = new Date(Date.now() + 3600000); //设置超时时间,这里1小时后失效
}
var connectSid = 's:' + signature.sign(req.sessionID, config.sessionSecret);
utils.resEnd(res, new SuccessResponse({ token: connectSid }));
})
);
router.get(
'/info',
[filter.authorize],
asyncHandler(async function (req, res) {
let info = { account: req.session.account };
utils.resEnd(res, new SuccessResponse(info));
})
);
router.post(
'/logout',
[filter.authorize],
asyncHandler(async function (req, res) {
req.session.destroy((err) => {
if (err) {
throw new errorHandler.BadPropertiesError('password error.');
}
utils.resEnd(res, new SuccessResponse({}));
});
})
);
router.post(
'/refreshToken',
[filter.authorize],
asyncHandler(async function (req, res) {
utils.resEnd(res, new SuccessResponse({}));
})
);
module.exports = router;