9.3KOA JsonWebToken
2020-01-06 本文已影响0人
帶頭二哥
JsonWebToken
介绍
JsonWebToken(简称:JWT)是一种完全的客户端客户端解决session存储方案,把所要存储的数据并且添加过期时间等等信息在服务器端打包加密最终生成 token
下发给客户端,客户端保存 token
用于下次请求,而 token
作为用户的有效凭证
优点
- 服务器端不需要存储和维护 session
- 由于加解密都是由服务器端进行,所以相比于 cookie 较安全(但也不是绝对的安全)
所需要的中间件
jsonwebtoken
jsonwebtoken
的node
实现方案
npm install jsonwebtoken --save
koa-jwt
jsonwebtoken
的koa
实现方案
npm install koa-jwt --save
使用案例
// 引入 koa 模块
const Koa = require('koa')
// 创建 koa 应用
const app = new Koa()
// 定义全局异常捕获
app.use(async (ctx, next) => {
return next().catch((err) => {
if (401 == err.status) {
ctx.status = 401;
ctx.body = '验证失败\n';
} else {
throw err;
}
});
});
// 引入 jwt 模块
var koaJWT = require('koa-jwt');
// 设置秘钥,并且设置不需要验证的路径
app.use(koaJWT({ secret: 'shared-secret' }).unless({ path: [/^\/public/,/^\/login/] }));
// 设置登录接口
// 引入 jsonwebtoken
var jwt = require('jsonwebtoken')
// 登录
app.use(async (ctx,next) => {
if(ctx.url.match(/^\/login/)) {
// 登录成功生成 token
ctx.body = jwt.sign({uid:'123456'},'shared-secret',{ expiresIn: '1h'})
} else {
await next()
}
})
// 验证成功后访问
app.use(async (ctx,next) => {
if(ctx.url.match(/^\/public/)) {
ctx.body = '可以访问 public';
} else if(ctx.url.match(/^\/api/)) {
// ctx.state 保存了 通过 jwt 解密后的数据
console.log(ctx.state)
ctx.body = "可以访问 api"
}
})
// 启动应用
app.listen(3000)