课程名称:六大场景 JWT鉴权方式实现
课程章节: JWT鉴权方式实现 6-5
课程讲师: Brian
课程内容:
实现koa-jwt鉴权
安装与使用
// npm install -S koa-jwt
import Koa from 'koa'
import JWT from 'koa-jwt'
import path from 'path'
import helmet from 'koa-helmet'
import statics from 'koa-static'
import router from './routes/routes'
import koaBody from 'koa-body'
import jsonutil from 'koa-json'
import cors from '@koa/cors'
import compose from 'koa-compose'
import compress from 'koa-compress'
import config from './config/index'
import errorHandle from './common/ErrorHandle'
const app = new Koa()
const isDevMode = process.env.NODE_ENV !== 'production'
// 定义公共路径,不需要jwt鉴权public 和login下的不校验
const jwt = JWT({ secret: config.JWT_SECRET }).unless({ path: [/^\/public/, /^\/login/] })
/**
* 使用koa-compose 集成中间件
*/
const middleware = compose([
koaBody(),
statics(path.join(__dirname, '../public')),
cors(),
jsonutil({ pretty: false, param: 'pretty' }),
helmet(),
errorHandle,
jwt
])
if (!isDevMode) {
app.use(compress())
}
app.use(middleware)
app.use(router())
app.listen(3000)
config/index.js 定义静态的JWT_SECRET
const DB_URL = 'mongodb://test:imooc123@localhost:27017/testdb'
const REDIS = {
host: 'localhost',
port: 6379
// password: '123456'
}
const JWT_SECRET =
'a&*38QthAKuiRwISGLotgq^3%^$zvA3A6Hfr8MF$jM*HY4*dWcwAW&9NGp7*b53!'
const baseUrl =
process.env.NODE_ENV === 'production'
? 'https://front.toimc.com'
: 'http://localhost:3000'
export default {
DB_URL,
REDIS,
JWT_SECRET,
baseUrl
}
errorHandle 集中处理错误
export default (ctx, next) => {
return next().catch((err) => {
console.log(err)
if (err.status === 401) {
ctx.status = 401
ctx.body = {
code: 401,
msg: 'Protected resource, use Authorization header to get access\n'
}
} else {
ctx.status = err.status || 500
ctx.body = Object.assign({
code: 500,
msg: err.message
}, process.env.NODE_ENV === 'development'
? { stack: err.stack } : {})
// console.log(err.stack);
}
})
}
生成与检验token
// npm install jsonwebtoken
// import jsonwebtoken from 'jsonwebtoken'
async login(ctx){
// 接收用户的数据
// 验证图片验证码的时效性,正确性
// 验证用户账号秘密是否正确
// 返回token
console.log('hello login')
let token = jsonwebtoken.sign({_id:'brian',exp:Math.floor(Date.now()/1000)+60*60*24},config.JWT_SECRET)
ctx.body = {
code:200,
token:token
}
}
多端运行npm命令
// npm install -D npm-run-all
package.json :
{
"script":{
"start":'"nodemon --exec bable-node src/index.js",
"debug":"nodemon --inspect ./dist/server.bundle.js",
"start:dist":"npm-run-all -p watch debug"
}
}
课程收获:
学习到了怎样使用kow-jwt实现鉴权,首先npm安装,在package.json 中导入app.use(jwt({ secret: ‘shared-secret’ })); JWT(JSON Web Tokens) 是一种方便地实现服务器与客户端安全通讯的解决方案,分为三个部分:Header、Payload、Signature,浏览器发送请求时将 token 带到服务器
Koa-jwt 是 koa 的一个中间件,帮助 koa web 服务获取并解析请求里面的 token,有默认的获取 token 的方式,并且支持各种配置,依赖于jsonwebtoken 库进行工作