安装express-jwt、jsonwebtoken 库
npm install express-jwt@5.3.1
npm install jsonwebtoken
这里需要注意的是,安装express-jwt的时候指定版本,最新版不支持下面的写法,需要使用最新版本,请查看最新的文档
在app.js 中配置 jwt 拦截
const expressJwt = require('express-jwt')
app.use('/api/*', expressJwt({
secret: 'abcdefg1234567890opqurstuvwijklmn'
}).unless({
// 这里配置不需要认证的路由地址, 路由地址必需写全
path: ['/api/login']
}))
定义路由,生成token
- 引入 jsonwebtoken, 用于生成 token
const jwt = require('jsonwebtoken');
app.post('/api/login', (req, res, next) => {
// 可以在这里生成 token
const secret = 'abcdefg1234567890opqurstuvwijklmn';
// 有效期 24 小时
const token = jwt.sign({
user_id: 'admin',
user_name: '系统管理员',
}, secret, {expiresIn: '24h'});
res.ok({ token })
});
app.get('/api/test', (req, res, next) => {
// 解析 token 内容
const user = req.user;
res.ok(user);
});
记的重启 app.js
测试
- 从浏览器直接访问下 /api/test 接口,结果如下, 会提示没有 token
- 生成 token, 使用 axios 请求 /api/login 接口
在api-test.js中测试,代码如下
axios.post('http://localhost:8082/api/login', {}).then(response => {
console.log(response.data);
})
3. 使用token 请求 /api/test 接口
const token = ``;
axios.get('http://localhost:8082/api/test', {
headers: { 'Authorization': 'Bearer ' + token }
}).then(response => {
console.log(response.data);
})
请求成功,根据上面的接口内容,拿到了 token 解析出来 user 信息
最基本的使用方式,如果程序足够简单,可以把必要的信息放到 token 里携带,从接口里直接取出来使用, 比如 user_id, user_name, 用户角色、用户部门等通用字段
这种方式生成的token, 没法让手动过期,只能等 token 有效期过后,才会失效
如果需要使 token 过期,可以集成 redis, 把 token 存 redis 里,使用express-jwt的自定义解析,判断token是否有效,这里就不说这部分内容了,个人没有用