iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Software Development

Web專案建置雜談系列 第 29

Web專案建置雜談 - 實作篇(十四)

  • 分享至 

  • xImage
  •  

vue-admin-template 的專案已經放置在 nginx 之後我們就要把api跟後台前端的部分進行串接了,那麼首先要設定的就是登入頁面的串接囉,登入之後就可以獲得權限進行各個頁面的使用。那麼登入實際上該做什麼呢?

login實作

講到login這個部分,礙於篇幅(因為也只剩下兩天了),所以我們就跳過一些說明了,我們採用的是server side 以 session 來驗證使用者的登入是否正確,那麼我們應該在api跟後台前端要怎麼配置呢?

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;


上一篇
Web專案建置雜談 - 實作篇(十三)
下一篇
未完待續,旅途將繼續下去….
系列文
Web專案建置雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言