token

116 阅读2分钟

继续引用express 的中间件最后的文件结果 修改client文件夹下js文件夹下index.js文件:

  • index.js代码如下:
    // 前端的代码, 发送一个请求
    function myAjax0() {
      const xhr = new XMLHttpRequest()
      xhr.open('get', '/api/login/login?username=QF001&password=123456')

      xhr.onload = function() {
        const res = JSON.parse(xhr.responseText)
        window.localStorage.setItem('token', res.token)
      }
      xhr.send()
    }
    myAjax0()

    function myAjax2() {
      const xhr = new XMLHttpRequest()
      xhr.open('post', '/api/users/info')
      xhr.onload = function() {
        console.log(JSON.parse(xhr.responseText))
      }
      xhr.setRequestHeader('authorization', window.localStorage.getItem('token'))
      xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
      xhr.send('id=20040216')
    }
    setTimeout(() => {
      myAjax2()
    }, 4000)

新建一个utils文件夹,在其下边新建一个token.js文件:

  • token.js代码如下:
    // 专门存储关于 token创建于解密的方法
    const jwt = require('jsonwebtoken')
    // 封装一个 关于 token 创建的方法
    // exports.initToken = ((info, to, timer) => {
    //   return jwt.sign(info, to, timer)
    // })
    exports.initToken = (info, to, timer) => jwt.sign(info, to, {expiresIn: timer})
    // 封装一个token解密的方法,因为他本身是 回调函数的解决方式,我们这里做一个改造,修改为promise的方式
    exports.testToken = (token, to) => {
      return new Promise((res, rej) => {
        jwt.verify(token, to, (err, data) => {
          if(err) {
            res({
              code: 0,
              msg: err
            })
            return
          }
          res({
            code: 1,
            msg: data
          })
        })
      })
    }

新建一个conf文件夹,在其下边新建一个config.js文件

  • config.js文件如下:
    // 内部存储一些多次使用的字符串,比如token的令牌,还有一些正则(用户名,密码,id的校验)
    exports.To = 'QF001'

修改router文件夹下的users.js文件:

  • users.js文件代码如下:
    // 导入第三方包
    const express = require('express')
    const { To } = require('../conf/config')
    const { UsersInfo, UsersSetName } = require('../controller/users')
    const { testToken } = require('../utils/token')

    // 创建一个分表
    const UsersRouter = express.Router()
    // 验证是否有token
    UsersRouter.use((req, res, next) => {
      if(!req.headers.authorization) {
        return next(4)
      }
      // 如果代码执行到这个位置,说明一定有token,此时去解析token
      testToken(req.headers.authorization, To).then((res) => {
        if(res.code === 1) {
          return next()
        } else {
          return next(5)
        }
      })
    })
    // 挂载分表
    UsersRouter.post('/info', UsersInfo)
    UsersRouter.post('/setName', UsersSetName)
    // 导出路由表
    module.exports = UsersRouter

在router文件夹下新建一个login.js文件:

  • login.js文件代码如下:
    // 导入第三方包
    const express = require('express')
    const { To } = require('../conf/config')
    const { initToken } = require('../utils/token')
    // 创建一个分表
    const LoginRouter = express.Router()
    // 挂载分表
    LoginRouter.get('/login', (req, res) => {
      /**
       * 此时是登录接口。应该是首先验证参数(去请求中阃件验证)
       * 需要去数据库根据用户传递的信息找到对应的数据,返回给前端
       * 并且生成一个token同时传递给前端
       * */ 
      // 通过接口传递过来的数据(暂时使用),生成一个token
      const token = initToken(req.query, To, 3)
      res.send({
        code:1,
        msg:'你看到我说明登陆成功',
        token,
      })
    })
    module.exports = LoginRouter

在router文件夹的index.js总表文件中引入login.js分表

  • index.js文件代码如下:
    // 导入第三方包
    const express = require('express')
    const CartRouter = require('./cart')
    const GoodsRouter = require('./goods')
    const LoginRouter = require('./login')
    const UsersRouter = require('./users')

    // 创建一个路由总表
    const Router = express.Router()

    // 添加分表
    Router.use('/goods', GoodsRouter)
    Router.use('/users', UsersRouter)
    Router.use('/cart', CartRouter)
    Router.use('/login', LoginRouter)
    // 导出总表
    module.exports = Router