7. Node.js express 集成 jwt,使用token验证请求

361 阅读1分钟

安装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']
}))

image.png

定义路由,生成token

  1. 引入 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);
});

image.png

记的重启 app.js

测试

  1. 从浏览器直接访问下 /api/test 接口,结果如下, 会提示没有 token

image.png

  1. 生成 token, 使用 axios 请求 /api/login 接口

在api-test.js中测试,代码如下

axios.post('http://localhost:8082/api/login', {}).then(response => {
    console.log(response.data);
})

image.png

3. 使用token 请求 /api/test 接口

const token = ``;
axios.get('http://localhost:8082/api/test', {
    headers: { 'Authorization': 'Bearer ' + token }
}).then(response => {
    console.log(response.data);
})

image.png

请求成功,根据上面的接口内容,拿到了 token 解析出来 user 信息

最基本的使用方式,如果程序足够简单,可以把必要的信息放到 token 里携带,从接口里直接取出来使用, 比如 user_id, user_name, 用户角色、用户部门等通用字段

这种方式生成的token, 没法让手动过期,只能等 token 有效期过后,才会失效

如果需要使 token 过期,可以集成 redis, 把 token 存 redis 里,使用express-jwt的自定义解析,判断token是否有效,这里就不说这部分内容了,个人没有用