天天看點

JWT -- 在express 項目中的處理

關于jwt 相關介紹可見: https://restfulapi.cn/page/jwt

使用 jsonwebtoken JWT 插件

可以使用UUID Generator vscode 插件 為其生成加入一段不規則随機字元串

utils/jwt.js

const jwt = require('jsonwebtoken')
const { promisify } = require('util')
const { uuid } = require('../config/config.default')
const tojwt = promisify(jwt.sign)
const verfiy = promisify(jwt.verify)

// jwt 驗證:
module.exports.verifyToken = function (requried=true) {
  return async (req, res, next) => {
    var token = req.headers.authorization
    token = token ? token.split("Bearer ")[1] : null
    if (token) {
      try {
        let userinfo = await verfiy(token, uuid)
        req.user = userinfo
        next()
      } catch (error) {
        res.status('402').json({ error: '無效的token' })
      }
    }else if(requried){
      res.status(402).json({ error: "請傳入token" })
    }else{
      next()
    }
    
  }
}

// jwt 生成:
module.exports.createToken = async userinfo => {
  var token = await tojwt(
    { userinfo },
    uuid,
    {
      expiresIn: 60 * 60 * 24
    }
  )
  return token
}





// var token = jwt.sign({foo:'hello'},'555')
// console.log(token);

// var jwts =  jwt.verify(
//   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJoZWxsbyIsImlhdCI6MTY1MDk0MzAwNn0.e2yqqJMlOq5uR9udeCl5KAjjHsK-LsJYAFv4ro8gaTc'
//   , '555'
// )
// console.log(jwts);
           

cotroller/userController.js 在登陸接口控制器中生成token 并傳回給用戶端

const { createToken } = require('../util/jwt')

// 使用者登入
exports.login = async (req, res) => {
  // 用戶端資料驗證
  // 連結資料庫查詢
  var dbBack = await User.findOne(req.body)
  if (!dbBack) {
    res.status(402).json({ error: "郵箱或者密碼不正确" })
  }

  dbBack = dbBack.toJSON()
  //
  dbBack.token = await createToken(dbBack)
  res.status(200).json(dbBack)
}
           

router/user.js 在接口路由中以中間件的形式去使用驗證token

const {verifyToken}  = require('../util/jwt')

router
.get('/getchannel',verifyToken(),userController.getchannel)
.get('/getuser/:userId',verifyToken(false),userController.getuser)
//....
           

繼續閱讀