当前位置:首页 > VUE

vue node实现登录验证

2026-01-23 02:15:28VUE

Vue 和 Node.js 实现登录验证

前端部分 (Vue.js)

安装必要的依赖:

npm install axios vue-router vuex

创建登录表单组件 (Login.vue):

vue node实现登录验证

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="username" placeholder="Username" />
    <input v-model="password" type="password" placeholder="Password" />
    <button type="submit">Login</button>
  </form>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async handleSubmit() {
      try {
        const response = await axios.post('http://localhost:3000/login', {
          username: this.username,
          password: this.password
        });
        localStorage.setItem('token', response.data.token);
        this.$router.push('/dashboard');
      } catch (error) {
        console.error('Login failed:', error);
      }
    }
  }
}
</script>

配置路由和全局状态管理 (main.js):

import Vue from 'vue';
import VueRouter from 'vue-router';
import Vuex from 'vuex';
import App from './App.vue';

Vue.use(VueRouter);
Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    token: localStorage.getItem('token') || null
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
      localStorage.setItem('token', token);
    },
    clearToken(state) {
      state.token = null;
      localStorage.removeItem('token');
    }
  }
});

const router = new VueRouter({
  routes: [
    { path: '/login', component: () => import('./Login.vue') },
    { 
      path: '/dashboard', 
      component: () => import('./Dashboard.vue'),
      meta: { requiresAuth: true }
    }
  ]
});

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.state.token) {
      next('/login');
    } else {
      next();
    }
  } else {
    next();
  }
});

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');

后端部分 (Node.js)

安装必要的依赖:

vue node实现登录验证

npm install express jsonwebtoken bcryptjs cors body-parser

创建服务器 (server.js):

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cors = require('cors');
const bodyParser = require('body-parser');

const app = express();
app.use(cors());
app.use(bodyParser.json());

const SECRET_KEY = 'your-secret-key';
const users = [
  {
    id: 1,
    username: 'admin',
    password: bcrypt.hashSync('admin123', 8)
  }
];

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username);

  if (!user) return res.status(404).send('User not found');

  const passwordIsValid = bcrypt.compareSync(password, user.password);
  if (!passwordIsValid) return res.status(401).send('Invalid password');

  const token = jwt.sign({ id: user.id }, SECRET_KEY, {
    expiresIn: 86400 // 24 hours
  });

  res.status(200).send({ token });
});

app.get('/protected', (req, res) => {
  const token = req.headers['x-access-token'];
  if (!token) return res.status(403).send('No token provided');

  jwt.verify(token, SECRET_KEY, (err, decoded) => {
    if (err) return res.status(500).send('Failed to authenticate token');
    res.status(200).send('Access granted to protected content');
  });
});

app.listen(3000, () => console.log('Server running on port 3000'));

安全注意事项

使用 HTTPS 保护传输中的数据 设置适当的 CORS 策略 实现 CSRF 保护 定期轮换 JWT 密钥 设置合理的令牌过期时间 实现速率限制防止暴力破解 对密码进行加盐哈希处理 (bcrypt)

测试流程

启动 Node.js 服务器:node server.js 运行 Vue 应用:npm run serve 访问登录页面并输入凭据 验证成功登录后重定向到受保护页面 检查本地存储中的令牌 尝试访问受保护路由验证守卫是否有效

标签: vuenode
分享给朋友:

相关文章

vue实现组件循环

vue实现组件循环

Vue 组件循环的实现方法 在 Vue 中实现组件循环通常使用 v-for 指令,可以循环渲染数组或对象的数据到组件上。 基本数组循环 通过 v-for 指令遍历数组,渲染多个相同结构的组件。…

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现删除

vue实现删除

Vue 实现删除功能的方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,并为每个项绑定唯一标识符(如 id)。例如: <ul…

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue实现ssr

vue实现ssr

Vue 实现 SSR(服务端渲染) Vue 的服务端渲染(SSR)允许在服务器端生成完整的 HTML 内容,再发送到客户端,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的关键步骤和…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…