node:jwt、拦截器-学习笔记
生活随笔
收集整理的這篇文章主要介紹了
node:jwt、拦截器-学习笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- node:jwt、攔截器
- nodemon
- jwt
- 攔截器
- 項目部署-hash
- 項目部署-history
node:jwt、攔截器
nodemon
- 每次修改代碼后都需要手動重啟服務?
- cnpm i -S nodemon
- nodemon-每次保存時自動重啟
- nodemon main.js --exec babel-node 使用babel-node執行
- npm run dev2
jwt
- 比如鑰匙
- 其中第一段為 header(頭),第二段為 payload (負載),第三段為signature(簽名)
- header: 定義token類型和簽名算法,只做base64
- payload: 保存一些不敏感用戶信息,如用戶名, 只做base64
- sign: 簽名,header+payload+secret(加鹽) 一起簽名算法加密 生成加密字符串
- secret:相當于自己私有的鑰匙(很長的字符串64) secret在服務端(私有)
- 以上知道jwt如何生成, 驗證jwt是不是有效(通過secret解密)
- cnpm i -S jsonwebtoken
- 服務端一旦生成jwt token,只能等待它過期
util/constan.js用于放常量
const constant = {secret: "xxxdfsdfsdasdfsdfsdf" //鹽 }export default constantuser.ctrl.js
//用戶控制器 操作用戶的接口 import jwt from 'jsonwebtoken' import constant from '../util/constant' import logger from '../util/logger' import * as userService from '../service/user.service'const operations = {//生成tokengenerateToken(data){return jwt.sign(data, constant.secret, {expiresIn: '60000' //ms 1d---1天})},// 用戶登錄接口login: function(req, res){let {account, password} = req.body;logger.info("調用用戶登錄接口開始"+account+" "+password)userService.findUser(account, password).then(data=> {if(data){//data中不能有密碼let result = {data:data,msg: "用戶登錄成功"}let jwt = operations.generateToken(result);result.token = jwt;res.status(200).json(result)logger.info("用戶登錄成功")}else{res.status(400).json({"msg":"用戶登錄失敗"})logger.info("用戶登錄失敗")}})}, }export default operations攔截器
- 作用:過濾過無效請求,包括沒有jwt,無效的jwt等
my.route.js:
//路由 import jwt from 'jsonwebtoken' import constant from '../util/constant' import express from 'express' import userCtrl from '../controllers/user.ctrl' import logger from '../util/logger';const router = express.Router(); //使用express框架自帶的路由 類比vue-routerexport default function(app){//控制器接口--需要路由 接口請求方式(get post)//接口定義請求方式: get post delete put//用戶 路由地址 請求方式 控制器接口router.route('/user/list-page').post(userCtrl.listPage);router.route('/user/create').post(userCtrl.createUser);router.route('/user/update').post(userCtrl.updateUser);router.route('/user/delete/:id').post(userCtrl.deleteUser);router.route('/user/query').get(userCtrl.query);router.route('/user/list').get(userCtrl.list);router.route('/user/login').post(userCtrl.login);// /api/user/login//權限let checkPermission = (req, res, next)=>{logger.info("權限檢查。。。")//若是跨域請求 首先會有一個試探請求 OPTIONSif (req.method === 'OPTIONS'){res.send({"msg":"ok"})} else if (req.originalUrl === '/api/user/login'){//登錄不限制next();} else if (req.headers.hasOwnProperty('token')){//驗證tokenlogger.info("token 驗證", req.headers.token)//驗證 合法 有效jwt.verify(req.headers.token, constant.secret, function(err, decoded){if (err) {//logger.error(err); //無效 剛過期(刷新token)if (err.name === 'TokenExpiredError') { //過期logger.error('token過期');// 得到過期時間 若半小時以內 可以刷新token 即不需要重登錄let time = ((new Date().getTime()-err.expiredAt.getTime())/(1000*60)).toFixed(2)if (time<=30){logger.info('生成新的token返回前端'); //與登錄一樣 前端要用新token//根據code返回新token, 前端拿到新token再次發請求res.send({"code":"10001", "token":"xxxxxx"});}}else if (err.name === 'JsonWebTokenError'){logger.error('token無效');}} else {logger.info(JSON.stringify(decoded))req.user = decoded; //將解密的數據保存在user屬性中next();}})} else {logger.info("沒有token,無效請求")res.send({"msg":"沒有token,無效請求"})}}app.use(checkPermission)//合同//把路由配置在myexpress實例上app.use('/api', router); }項目部署-hash
windows服務器上部署:
- 前端打包npm run build生成打包目錄dist, 把dist目錄放入http服務器訪問
- npm i -g serve http服務 也可使用nginx,見文章:https://blog.csdn.net/hhhmonkey/article/details/119333875
- serve dist
- 后端啟動 先安裝依賴cnpm i 啟動npm run start
- 代碼上傳ftp
linux服務器:
- 代碼上傳ftp+xshell xshell可以在終端上上傳文件 yum install
- 用xhell連接服務器
- 啟動后端 先安裝依賴 要創建一個sh文件 添加命令:nohup npm run start & 在后端永久運行
- 添加執行權限 sudo chmod +x start.sh
查看是否啟動,用搜索語句grep
- 前端部署 解壓dist目錄,創建一個sh文件 文件內容: nohup serve dist & 前端若要修改端口可查看npm官網的serve文檔
- 服務器還需要開放端口
常用命令
ls 顯示當前目錄內容
cd 切換目錄
ps 查看進程
vim 編輯文本
搜索進程:ps -ef|grep node
項目部署-history
- 打包npm run build
- 安裝插件connect-history-api-fallback
- 在myexpress.js中配置插件
- 只需要啟動一個服務即可 npm run start
- 原理: http://localhost:5003/loan-input/index—重定向http://localhost:5003/—
系統檢查到loan-input/index就跳轉到對應的模塊了
總結
以上是生活随笔為你收集整理的node:jwt、拦截器-学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node:http协议、sql、接口
- 下一篇: webpack图解-学习笔记