express-jwt,token生成相关

398 阅读1分钟
  1. 工作原理

    • 服务端对用户信息进行加密之后保存在客户端,localstorage,sessionstorage等

    • 客户端通过请求头的anthorization,将token字符串发送给服务端进行验证

    • 服务端认证成功后将内容返回给客户端

  2. 组成含义

    • header(类型/加密算法),payload(信息),siganature(签名).三者之间用.隔开

    • payload是真正用户信息

    • header,siganature是保证token安全性相关的东西

  3. 使用方式


//请求头设置

Authorization:Bearer token

//demo
//生成jwt字符串
const jwt = require('jsonwebtoken')
const express = require('express')
// 新的导入方式,旧版本导入方式有差异
const {expressjwt} = require('express-jwt')
const cors = require('cors')
const app = express()
app.use(express.urlencoded({extended:false}))
app.use(cors())
// expressJWT:解析token成json对象,输出到req.user对象,新版输出到req.auth
// unless:匹配不需要解析的请求
//algorithms: ["HS256"]:加密算法
const secretKey = 'hahaha'
app.use(expressjwt({secret:secretKey,algorithms: ["HS256"]}).unless({path:[/^\/api\//]}))
// 用户信息,秘钥,配置信息
app.post('/api/login',(req,res)=>{
  console.log(req.body);
  if(req.body.username!=='admin'||req.body.password!=='123'){
   return res.send('login fail')
  }
  res.send({
    status:0,
    msg:'登录成功',
    // expiresIn token的有效时间,不带单位默认为秒 ,带单位: "1 days", "11h"
    token:jwt.sign({username:req.body.username},secretKey,{expiresIn:'360s'})
  })

})

app.get('/admin/loginInfo',(req,res)=>{
  res.send({
    status:0,
    msg:'请求成功',
    data:req.auth
  })
})

// const decode = (req)=> {
 
//   const authorization = req.headers.authorization
//   let token = ''
//   if (authorization.indexOf('Bearer') >= 0) {
//     token = authorization.replace("Bearer ","")
//   } else {
//     token = authorization
//   }
//   // console.log(token)
//   return jwt.verify(token,secretKey,{algorithms: 'HS256'})
// }

// 全局中间件,处理token异常
app.use((err,req,res,next)=>{
  console.log(err);
  if(err.name=== 'UnauthorizedError'){
   return res.send({
      status:401,
      msg:'无效的token'
    })
  }
  res.send({
    msg:'未知错误'
  })
})


app.listen(8088,()=>{
  console.log('server is running');
})