vue项目中使用token令牌验证登录(前后端)个人笔记,仅供参考

1.安装依赖项

npm install jsonwebtoken --save

2.在服务端进行配置

1.新建auth.js文件

const jwt = require('jsonwebtoken');
 
const secretKey = 'woshiaikunmeifannao'
// 生成JWT令牌
const createToken = (payload, options = {}) => {
  const defaultOptions = { expiresIn: '1h' };
  const combinedOptions = Object.assign({}, defaultOptions, options);
  const token = jwt.sign(payload, secretKey, combinedOptions);
  return token;
};
 
// 验证JWT令牌
const verifyToken = (token) => {
  try {
    const decoded = jwt.verify(token, secretKey);
    return decoded;
  } catch {
    // 令牌无效或已过期
    return null;
  }
};
 
// 解码JWT令牌
const decodeToken = (token) => { return jwt.decode(token); };
// 认证中间件
const authenticate = (req, res, next) => {
  const token = req.headers.authorization;
  if (!token) {
    return res.status(401).send('Unauthorized');
  }
  try {
    const decoded = jwt.verify(token, secretKey);
    req.user = decoded;
    next();
  } catch (error) {
    return res.status(401).send('Unauthorized');
  }
};
// 导出生成和验证 Token 的函数以及认证中间件
module.exports = {
  createToken,
  verifyToken,
  decodeToken,
  authenticate,
};

2.新建拦截请求及免拦截请求文件interceptReq.js

const { verifyToken } = require('./auth');
module.exports = (req, res, next) => {
  // 请求拦截是否登陆认证
  const authToken = req.headers['authorization'];
 // 如果登录则继续,以及是特定请求时通过,未登录时其他的请求会被拦截
  if (verifyToken(authToken)) {
    next();
  } else if(req.path==='/login' || req.path==='/register'){
    next();
  } else {
    return res.status(401).sendResponse({
      code: '401',
      data: '未登陆',
      message: 'token校验失败,请登录'
    });
  }
};

3.在app.js中挂载中间件

const express = require('express')
const app = express()
const cors = require('cors')
const bodyParser = require('body-parser')
const router = require('./router')
const interceptReq = require('./middleware/interceptReq')


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cors());
app.use(router)
app.use(interceptReq);

app.listen(4000,() => {
    console.log("服务器启动成功");
})

3.前端配置

1.安装vue-router  

npm i vue-router -s

这里我简写了,i是install,-s是save作用是将依赖项添加到配置文件中,方便管理

2.新建router文件,新建index.js文件

import {createRouter,createWebHistory} from 'vue-router'

const routes = [
    {
        name : 'homepage',
        path : '/homepage',
        component : () => import('../components/HomePage.vue'),
        /* children :[
            {
                name : 'body',
                path : '/body',
                component : () => import('../views/Body.vue')
            },
            {
                name : 'login',
                path : '/login',
                component : () => import('../views/Login.vue')
            },
        ] */
    },
    {
        name : 'about',
        path : '/about',
        component : () => import('../views/About.vue')
    }
];

const router = createRouter({
    history: createWebHistory(),
    routes,
})
//设置路由守卫
router.beforeEach((to,from,next) => {
    //这里可以配合store的使用,但是我比较懒。。。直接放到缓存中了
    let token = localStorage.getItem('token');
    if(token=== null || token === '' || token === undefined){
//未登录但是路由跳转到特定页面是允许 上面的路由太多了我删了一部分,所有直接复制会报错┗|`O′|┛ 嗷
        if(to.path==='/register' || to.path==='/login'){
            next();
        }else {
            alert('请先完成登录');
            next('/login');
        }
    }else {
        next();
    }
})

export default router;

3.同上,在main.js中进行挂载

import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import router from './router/index.js'
import App from './App.vue'

const app = createApp(App);
app.use(ElementPlus);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}
app.use(router)
app.mount('#app')

4.大功告成

由于我比较懒,后端的接口就写了登录和注册的,没有实践测试。。。仅供参考┗|`O′|┛ 嗷~~

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值