express + jwt 校验
express + jwt 校验
npm install express jsonwebtoken express-jwtimport express, { Request, Response } from 'express';
import jwt from 'jsonwebtoken';
import { expressjwt } from 'express-jwt'
const app = express();
const secretKey = 'secret_key' // 生成、解析 token 的秘钥
const refreshTokenSecret = 'refresh_token_secret' // 生成、解析 refreshToken 的秘钥
const accessTokenExpiry = '30m' // token 有效时长
const refreshTokenExpiry = '7d' // refreshToken 有效时长
const algorithms: jwt.Algorithm[] = ['HS256'] // 指定JWT令牌的签名算法
// 不需要进行jwt校验的接口
let unlessPathList = [
'/login',
'/refresh',
]
// 中间件用于验证JWT令牌
app.use(expressjwt({ secret: secretKey, algorithms }).unless({ path: unlessPathList }));
// 登录路由用于生成JWT令牌
app.post('/login', (req: Request, res: Response) => {
const user = { id: 1, username: 'example_user' };
const accessToken = jwt.sign(user, secretKey, { expiresIn: accessTokenExpiry });
const refreshToken = jwt.sign(user, refreshTokenSecret, { expiresIn: refreshTokenExpiry });
res.json({ accessToken, refreshToken });
});
// 刷新路由用于使用刷新令牌生成新的访问令牌
app.post('/refresh', (req: Request, res: Response) => {
const refreshToken = req.headers.authorization?.split(' ')[1] || '';
jwt.verify(refreshToken, refreshTokenSecret, (err, user) => {
if (err) {
return res.sendStatus(403);
}
const accessToken = jwt.sign(user, secretKey, { expiresIn: accessTokenExpiry });
res.json({ accessToken });
});
});
// 受保护的路由用于测试JWT认证
app.get('/protected', (req: Request, res: Response) => {
res.json(req.user);
});
// 启动服务器
app.listen(3000, () => {
console.log('服务器正在运行,访问地址:http://localhost:3000');
});
Last updated