Node.js的Koa实现的JWT用户认证方法
介绍了通过Node.js的Koa实现JWT用户认证的方法,分享给大家如下:
一、预先了解
基于令牌的认证Koajs中文文档Koa框架教程二。环境
微软Visual Studio 2017集成开发环境Node.js v8.9.4Javascript运行环境三。开始工作,逐步提高
1.创建基本的静态资源服务器和基础架构
下面是基本代码,实现了静态服务器和令牌认证异常时的处理。
接下来,我们将逐步增加这个基本代码下的注册、登录和信息功能。
const path=require(' path ');//用于处理目录路径const Koa=require(' Koa ');//web开发框架const serve=require(' KOA-static ');//静态资源处理const route=require(' KOA-route ');//路由中间件const jwt=require(' jsonwebtoken ');//用于发布和解决` token ` const jwt KOA=require(' KOA-jwt ');//用于路由权限控制const KOA body=require(' KOA-body ');//用于将查询字符串解析为` CTX . request . query ` const app=new KOA();Constwebsite={ scheme: ' http ',host:' localhost ',port3360 1337,join 3360 function(){ return ` $ { this。scheme} ://$ {this。主机} : $ {this。端口}。/*令牌验证异常时的处理,如令牌过期和令牌错误*/app.use ((CTX,下一步)={返回下一步()。catch ((err)={if (err。status==401) {CTX。状态=401;ctx.body={ ok: false,msg: err.originalError?err . originalerror . message : err . message } } else { throw err;} });});/*查询字符串解析为` CTX . request . query ` */app . use(KOA body());/*路由权限控制*///待办事项./……/* POST/API/注册注册*///待办事项./……/* GET/API/登录登录*///待办事项./……/* GET /api/info信息*///待办事项./*静态资源处理*/。/*监听服务器端口*/app.listen(网站.端口,()={ console . log(` $ {网站. join ()})服务器已经启动!`);});接下来,我们将在注册、登录和信息的注释下添加实现代码。
2.路由权限控制
注册、登录界面等资源不需要认证,信息界面需要认证。
/*路由授权控制*/app . use(jwtkoa({ secret 3360 secret })。除非({//设置登录和注册接口,否则无需身份验证即可访问path :[/\/API \/log in/,/\/API \/register/,\/api)。)*$///设置私有接口以外的其他资源,无需认证即可访问]});3.登记
/* POST/API/register registration */app . use(route . POST('/API/register ',async (CTX,next)={ const body=CTX . request . body;/* * body={*用户: '颜瑜',*密码: '123456' *} *///确定body.user和body.password的格式是否正确//待办事项.//确定用户是否注册了//待办事项.//保存到数据库中的新用户//。如果(注册成功){//返回一个成功注册到前端的JOSN数据returnctx.body={ok:true,msg: '注册成功',token 3360 gettoken({ user : body . user,Password:body。password })} } else {//返回一个未能注册到前端returnctx的JOSN数据。body={ok: false,msg: '注册失败' } } });/*获取令牌*/函数gettoken(有效负载={}) {return jwt。sign(有效载荷,秘密,{在:' 4h '到期})的周期为4小时;}
3.注册
/* GET/API/log in log in */app . use(route . GET('/API/log in ',async (CTX,下一步)={ const query=CTX . request . query;/* *查询={*用户: '颜瑜',*密码: '123456' *} *///判断query.user和query.password格式是否正确//待办事项.//判断是否已登记//待办事项.//判断姓名和学号是否正确//待办事项.返回CTX。body={ok : true,msg : '登录成功',token 3360 gettoken({ user 3360 query。用户,密码:查询。密码})});
前端获得令牌后,可以将其存储在任何本地存储中。
4.信息
/* GET/API/info info */app . use(route . GET('/API/info ',async (CTX,Next)={//令牌将附加到前端访问中请求头有效负载=getjwtpayload(CTX . headers . authorization)/* *有效负载={* user3360 '颜瑜',* iat3360 1524042454,* exp : 1524056854 *} *///根据payload.user//to-do查询数据库中该用户的信息.const info={name: '颜瑜',age: 10,sex: '男性' }让获取信息成功=trueIf(成功获取信息){returnctx。body={ok: true,msg: '成功获取信息',data: info}} else {returnctx。body={ok: false,msg: '获取信息失败' } });/*通过token获得JWT的有效载荷部分*/函数getjwtpayload(token){//验证并解析jwt返回jwt。verify(token . split(')[1],secret);}
当访问需要验证的接口时,您需要将授权:承载[令牌]字段附加到请求头。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
原链接地址:https://segmentfault.com/a/1190000014727547
版权声明:Node.js的Koa实现的JWT用户认证方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。