11.jwt
-- 未经授权禁止转载 --

     安装jsonwebtoken

           npm i jsonwebtoken


     时间戳转换网站

           https://tool.lu/timestamp


     Base64 解码网站

           https://base64.us


     Jwt 解码网站

           https://jwt.io


    jwt(JSON Web Token) 是一种基于令牌(Token)的认证和授权机制

           JWT由三部分组成 Header(头部)、 Payload(负载)、 Signature(签名)


          Header(头部)

           {

             "alg": "HS256", //algorithm 算法

             "typ": "JWT" //type 类型

           }


           Payload(负载)

                 {

                   "sub": 1, //Subject 主题 (用户唯一id)

                   "iss": "dengruicode.com", //Issuer 发行者

                   "iat": 1719930255, //Issued At 发行时间

                   "nbf": 1719930255, //Not Before 生效时间

                   "exp": 1720016655, //Expiration Time 过期时间

                   "aud": [ //Audience 观众字段为空,表示没有观众限制,可以被任何接收方处理

                     ""

                   ],

                   "data": { //自定义数据

                     "name": "邓瑞",

                     "gender": "男"

                   }

                 }            


           Signature(签名[用于验证 jwt 的完整性和防篡改])

                 HMACSHA256(

                   base64UrlEncode(Header) + "." +

                   base64UrlEncode(Payload),

                   密钥

                 )


import Koa from 'koa'
import Router from '@koa/router'
import JWT from 'jsonwebtoken'

const hostname = "127.0.0.1"
const port = 8008

const app = new Koa()
const router = new Router() //实例化一个 Router 对象

router.get('/', async ctx => {
    let key = 'koaTest' //密钥
    let token = generateToken(key) //生成token

    parseToken(token, key) //解析token

    ctx.body = token
})

app.use(router.routes()) //将定义在 router 对象中的路由规则添加到 app 实例中

//生成token
let generateToken = key => {
    let id = 1 //用户唯一id
    let now = Math.floor(Date.now() / 1000) //当前时间戳 单位:秒
    let expire = 24 * 60 * 60

    //负载
    let payload = {
        sub: id, //Subject 主题 (用户唯一id)
        iss: 'dengruicode.com', //Issuer 发行者
        iat: now, //Issued At 发行时间
        nbf: now, //Not Before 生效时间
        exp: now + expire, //Expiration Time 过期时间
        aud: [''], //Audience 观众字段为空,表示没有观众限制,可以被任何接收方处理
        data: { //自定义数据
            name: '邓瑞',
            gender: '男',
        }
    }

    //使用负载(payload)、密钥(key)和指定的签名算法(HS256)生成token
    let token = JWT.sign(payload, key, { algorithm: 'HS256' })
    return token
}

//解析token
let parseToken = (token, key) => {
    let payload = JWT.verify(token, key, { algorithm: 'HS256' })
    console.log('解析后的payload:', payload)
}

app.listen(port, hostname, () => {
    console.log(`服务器已启动: http://${hostname}:${port}`)
})