课程章节:第3章 技术选型和知识点介绍(下) 3-15 jwt-加密用户信息
课程讲师:双越
课程内容:
上节课学习了 JWT 的理论知识,这节课上手应用 JWT。
项目初始化
koa2 -e koa-jwt-study
cd koa-jwt-study
yarn install
安装 JWT 相关依赖模块:
yarn add koa-jwt jsonwebtoken
koa-jwt :基于 jsonwebtoken 的 koa 中间件,用于校验 token,控制哪些路由需要 jwt 验证,哪些路由不需要验证。
jsonwebtoken - 它是JWT 技术 在 Node 环境下的一种实现,用于生成token,在 koa2 以后的版本不再提供 jsonwebtoken 的方法,所以需要另行安装。
koa-jwt 依赖 jsonwebtoken 这个模块,所以在代码中中直接使用 koa-jwt 去校验客户端发来的 token 即可。
使用
生成 JWT 需要使用秘钥,所以创建一个配置文件,用于存放 secret:
// conf/index.js
module.exports = {
JWT_SECRET: 'H7&_DVI87@D'
}
导入相关中间件并注册:
// app.js
const jwt = require('jsonwebtoken')
const { SECRET } = require('./config')
app.use(jwtKoa({
secret: SECRET
}).unless({
// 排除不需要校验 token 的路径
path: [/\/user\/login/]
})
对于每个请求,都会经过此中间件,它会使用 secret 来校验请求中的 token 是否合法,通过校验的请求才能往下走,交给其他的中间件去处理。
未通过 koa-jwt 校验的请求,会返回客户端 401,表示没有权限访问。
使用 sign
签名方法,在用户登录接口中生成 token:
// routes/user.js
const jwtKoa = require('koa-jwt')
const { SECRET } = require('./config')
router.post('/login', async (ctx, next) =>{
const { username, password } = ctx.request.body
// 假设通过了数据库查询,验证用户身份正确
// 使用 koa-jwt 生成 token
const token = jwt.sign({
username,
}, SECRET, {
expiresIn: '1h'
})
ctx.body = {
code: 0,
data: {
token
}
}
})
到此,当用户访问 /users/login 接口,就能生成 token了,服务端会将生成的token 返回给客户端,客户端接收响应后,将 token 存储起来,之后的请求必须携带上此 token,才能通过 koa-jwt 中间件的校验
课程收获:
这节课学习了使用 koa-jwt 来校验token和白名单,使用 jsonwebtoken 生成 token。