jwt生成token

171 阅读1分钟

使用jwt生成token

app.post('/api/login', async (req, res) => {
    const user = await User.findOne({
        email: req.body.email
    })
    if (!user) {
        return res.status(422).send({
            mes: '用户名不存在'
        })
    }
    const isPassword = require('bcrypt').compareSync(   //比较
        req.body.password,   //文明
        user.password    //密文
    )
    if (!isPassword) {
        return res.status(422).send({
            msg: "密码无效"
        })
    }
    //生成token     
    //已经不用session了关了它游览器就没有了  用jwt可以设置保存时间,维持无状态连接

    const token = jwt.sign({
        id: String(user._id),
        name: String(user.name),
        indetity: String(user.indetity),

    }, SECRET, {
        expiresIn: 30 * 60, //设置过期时间  单位s
    })  //签名   

    res.send({
        user,
        token: "Bearer " + token
    })
})

jwt签名加密生成token值存入localstroge 选择加密的字段 后面可以用jwt-decode进行解析得到想要的数据 并使用vuex/pinia进行全局数据管理

前端使用element-plus 代码:

<script setup lang="ts">
import { ref, reactive} from 'vue'
import { registerType} from '../utils/types'
import { ElMessage, FormInstance } from 'element-plus'
import { useRouter } from 'vue-router'
import axios from '../utils/http' //请求
import jwt_decode from 'jwt-decode'
import { useAuthStore } from '../store/index'
import qs from 'qs' //请求
const ruleFormRef = ref<FormInstance>()
const router = useRouter()
const store = useAuthStore()
const loginUser = ref<registerType>({
  email: '',
  password: '',
})
const handleSubmit = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate(async (valid) => {
    if (valid) {
      var data = qs.stringify({
        email: loginUser.value.email,
        password: loginUser.value.password,
      })
      var config = {
        method: 'post',
        url: '/api/login',
        data: data,
      }
      axios(config)
        .then(function (response) {
          const { token } = response.data
          localStorage.setItem('token', token)
          //解析token
          const decode = jwt_decode(token)
          store.setAuth(!!decode)
          store.setUser(decode)
          // console.log(decode)
          if (token) {
            ElMessage({
              message: '用户登录成功',
              type: 'success',
            })
            router.push('/home')
          }
        })
        .catch(function (error) {
          console.log(error)
        })
    } else {
      console.log('密码错误')
      return false
    }
  })
}

const rules = reactive({
  email: [{ required: true, message: '账号不能为空', trigger: 'blur' }],
  password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
})
</script>
<template>
  <div class="login">
    <section class="form-container">
      <div class="manage-tip">
        <span class="title">后台管理系统</span>

        <el-form ref="ruleFormRef" :rules="rules" :model="loginUser" class="loginForm" label-width="80px">
          <el-form-item label="账号" prop="email">
            <el-input v-model="loginUser.email" placeholder="请输入账号" />
          </el-form-item>
          <el-form-item label="密码" prop="password">
            <el-input v-model="loginUser.password" type="password" placeholder="请输入密码" />
          </el-form-item>

          <el-form-item>
            <el-button @click="handleSubmit(ruleFormRef)" class="submit-btn">登录</el-button>
          </el-form-item>
          <div class="tip">
            <p>
              还没有账号?现在<router-link to="/register">注册</router-link>
            </p>
          </div>
        </el-form>
      </div>
    </section>
  </div>
</template>

使用组件代码,进行调整,store进行全局数据管理。