登录
当使用Express结合jsonwebtoken
和express-jwt
来实现JWT功能和刷新token时,你可以按照以下示例进行操作:
首先,安装必要的库:
npm install express jsonwebtoken express-jwt
然后,创建一个Express应用程序并实现JWT功能和刷新token的示例代码:
import 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');
});
在这个示例中,我们创建了一个简单的Express应用程序,包含了登录路由用于生成JWT令牌,刷新路由用于生成新的访问令牌,以及受保护的路由用于测试JWT认证。在登录路由中,我们生成了访问令牌和刷新令牌,并在刷新路由中使用刷新令牌生成新的访问令牌。
请注意,这只是一个简单的示例,实际生产环境中可能需要更多的安全性措施和错误处理。希望这个示例能帮助你开始使用Express结合jsonwebtoken
和express-jwt
实现JWT功能和刷新token。