在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
JWT 简介什么是 JWT全称 该 { "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" } 为什么需要 JWT先看下一般的认证流程,基于 1、用户向服务器发送用户名和密码。 2、服务器验证通过后,在当前对话( 3、服务器向用户返回一个 4、用户随后的每一次请求,都会通过 5、服务器收到 但是这里有一个大的问题, 假如是服务器集群,则要求 session 数据共享,每台服务器都能够读取 session 。这个实现成本是比较大的。 而 JWT 的数据结构
{ "alg": "HS256", "typ": "JWT" }
当然也可以自定义私有字段。 但是要注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 算出签名以后,把 JWT 的安全
Node 简单demo—— Koa JWT 的实现说完理论知识,我们来看下如何实现 首先,用户登录后服务端根据用户信息生成并返回 这里我们用 jsonwebtoken ,可以生成 koa-jwt 中间件 对 快速搭建一个 koa 项目发现官方目前没有一个快速搭建 安装 npm install -g koa-generator
启动项目 打开 生成 Token为了演示方便,我这里直接定义了变量 const crypto = require("crypto"), jwt = require("jsonwebtoken"); // TODO:使用数据库 // 这里应该是用数据库存储,这里只是演示用 let userList = []; class UserController { // 用户登录 static async login(ctx) { const data = ctx.request.body; if (!data.name || !data.password) { return ctx.body = { code: "000002", message: "参数不合法" } } const result = userList.find(item => item.name === data.name && item.password === crypto.createHash('md5').update(data.password).digest('hex')) if (result) { const token = jwt.sign( { name: result.name }, "Gopal_token", // secret { expiresIn: 60 * 60 } // 60 * 60 s ); return ctx.body = { code: "0", message: "登录成功", data: { token } }; } else { return ctx.body = { code: "000002", message: "用户名或密码错误" }; } } } module.exports = UserController; 通过 客户端获取 token前端登录获取到 login() { this.$axios .post("/api/login", { ...this.ruleForm, }) .then(res => { if (res.code === "0") { this.$message.success('登录成功'); localStorage.setItem("token", res.data.token); this.$router.push("/"); } else { this.$message(res.message); } }); } 封装 // axios 请求拦截器处理请求数据 axios.interceptors.request.use(config => { const token = localStorage.getItem('token'); config.headers.common['Authorization'] = 'Bearer ' + token; // 留意这里的 Authorization return config; }) 校验 token使用 // 错误处理 app.use((ctx, next) => { return next().catch((err) => { if(err.status === 401){ ctx.status = 401; ctx.body = 'Protected resource, use Authorization header to get access\n'; }else{ throw err; } }) }) // 注意:放在路由前面 app.use(koajwt({ secret: 'Gopal_token' }).unless({ // 配置白名单 path: [/\/api\/register/, /\/api\/login/] })) // routes app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) 需要注意的是以下几点:
演示如果直接访问需要登录的接口,则会 先注册,后登录,不然会提示用户名或者密码错误 登录后带上 总结本文总结了关于 受制于篇幅,有机会单独说下 参考到此这篇关于Node使用koa2实现一个简单JWT鉴权的方法的文章就介绍到这了,更多相关Node koa2 JWT鉴权内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论