[转]使用express-jwt生成token的demo(转载请删除括号里的内容)

本文探讨了JWT(JSON Web Tokens)与Session在Web应用登录机制中的优缺点。通过一个具体的Node.js示例,展示了如何使用JWT进行用户认证,包括生成、解析token以及存储在cookie中的过程。同时,指出了JWT在信息更新和单点登录方面的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const express = require('express')
const jwt = require('express-jwt')
const jwtSign = require('jsonwebtoken')
const cookieParser = require('cookie-parser')
 
const getCookieExpires = () => {
  const d = new Date()
  d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
  return d.toGMTString()
}
 
const JWT_PRIVATE_KEY = '123_test'
const app = express()
 
 
 
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
 
// JWT默认会从req.header.authorization获取token,所以客户端请求中需要设置header的Authorization字段。
// 这个默认行为也可以通过getToken方法改变,比如从cookie中获取token
app.use(jwt({
  secret: JWT_PRIVATE_KEY,
  credentialsRequired: true,
  getToken: (req) => req.cookies.mt_token,
}).unless({
  path: [
    '/',
    '/user/login'
  ]
}))
 
app.get('/', (req, res) => {
  res.end('home')
})
 
// 使用JWT生成的token有个弊端:
// 1.第一次登录的时候,如果使用const token1 = jwtSign.sign(
//       {
//         username,
//       },
//       JWT_PRIVATE_KEY,
//       { expiresIn: 30 * 60 }
//     )生成token1,token1里只有username信息,这时候cookie中存的是token1
// 2.如果由于需求变更,需要token里面再加入password,role等信息,即const token2 = jwtSign.sign(
//       {
//         username,
//         role: 'admin',
//         password
//       },
//       JWT_PRIVATE_KEY,
//       { expiresIn: 30 * 60 }
//     ),这时候cookie中依然是token1,需要用户重新登录才能生成token2,并存到cookie中。
// 所以如果不重新登录,则token中依然还是只有username这个信息,没有password和role信息。
// 如果使用session就没有这个问题。
// 而且使用jwt生成的token,做不了单点登录。如果需要做单点登录,就需要引入redis做状态管理
app.get('/user/login', (req, res) => {
  const { username, password } = req.query
  if(username === 'test' && password === '123456'){
    const token = jwtSign.sign(
      {
        username,
        role: 'admin',
        password
      },
      JWT_PRIVATE_KEY,
      { expiresIn: 30 * 60 }
    )
    res.setHeader('Set-Cookie', `mt_token=${token};path=/;httpOnly;expires=${getCookieExpires()}`)
 
    res.json({
      code: 0,
      msg: '登录成功',
      token
    })
  } else {
    res.json({
      code: -1,
      msg: '用户名或密码不正确'
    })
  }
})
 
app.get('/user/info', (req, res) => {
 
  res.json(req.user)
})
 
app.use(function (err, req, res, next) {
  if (err.name === 'UnauthorizedError') {
    res.status(401).send('invalid token...');
  } else {
    res.send('error')
  }
});
 
const server = app.listen(9002, () => {
  const { address, port } = server.address()
  console.log('HTTP服务启动成功: http://%s:%s', address, port)
})

1.访问http://localhost:9002/user/login?username=test&password=123456模拟登录,当用户名和密码正确时,生成token并设置cookie。使用jwt生成的token,可以用express-jwt解析token里面的信息。解析后的信息存放在req.user中

2.访问http://localhost:9002/user/info可以获取用户信息。


---------------------
作者:_葱
来源:CSDN
原文:https://blog.csdn.net/qq_20567691/article/details/105601304
版权声明:本文为作者原创文章,转载请附上博文链接!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值