大家好,今天小编来为大家解答以下的问题,关于JSON Web Tokens(JWT)生成与解析教程,这个很多人还不知道,现在让我们一起来看看吧!
npminstall -g Express 生成器
然后使用express-generator快速构建一个express项目。命令是:
快递快递_演示
然后进入项目,安装express项目所需的依赖。命令是:
cdexpress_demo npm 安装
现在项目已经成功构建了,我们可以看一下项目结构:
首先,在util下创建common.js。该文件主要包含常用的公共方法。我这里目前只有两个公共方法:paramAll(用于获取前端传递过来的参数)、encryPassword(密码拼接字符串的MD5加密)。
您可以看到第一行导入了加密依赖项。 MD5加密需要这个包,所以我们先安装这个依赖。命令是:
npminstall --save-dev 加密
然后在util下创建bootloader.js,主要封装了几个全局函数,用于输出测试数据和返回数据给前端。
然后打开config.js并配置jsonwebtoken生成令牌所需的secret。秘密是加密密钥,不能泄露给其他人。
现在我们走在正确的轨道上。我们一直在讨论使用jsonwebtoken 来生成令牌。当然,我们首先安装jsonwebtoken。命令是:
npminstall --save-dev jsonwebtoken
接下来我们将编写一个生成离线代币的接口。我们的接口实现是在router下实现的。首先打开router/users.js并导入我们刚刚在文件顶部编写的几个文件:
接下来我们实现该接口,通过jsonwebtoken结合用户的基本信息和我们设置的key Secret生成token:
通过我们刚刚封装的paramAll()向前端传递参数。密码是私有数据,因此通过加密后的encryPassword()进行MD5加密。然后将Secret 与jsonwebtoken.sign(info, Secret, options) 结合起来加密并生成令牌。我们看一下界面效果:
可以看到我们已经成功将用户信息转换成了token。接下来我们看看如何反向解析出用户数据以及如何使用token:
jsonwebtoken.verify(令牌,秘密,回调)
我们实现一个接口来解析用户token来获取用户信息:
这里需要注意一点:如果token解析失败或者token已经过期,会返回err。只有正确解析用户数据才会返回数据。我们可以看到效果:
可以看到我们成功解析了用户数据。接下来我们就可以看看在真实的API接口中我们是如何使用jsonwebtoken来解析并使用token的。首先我们提到接口安全一般都需要签名。签名规则仍然使用我一直使用的规则:
1、将接口需要的参数添加到当前时间戳参数time中,time取毫秒值,组装成json对象。
2. 将所有参数以key=value的形式按ASCII顺序排序,得到waitSign。
3、对waitSign进行MD5加密,获取signParam。
4.将signParam转换为纯小写,得到最终的签名sign。
接下来,我们首先将生成签名的算法封装成一个公共方法,放在common.js中:
API接口不可避免地需要数据库操作。接下来我们封装一下数据库操作。首先在config.js中配置数据库配置信息:
接下来在项目根目录下创建db文件夹,并在db下创建mysql.js,用于封装数据库的增删改查操作。首先封装连接池初始化和连接池释放方法:
然后封装一个用户用于插入和更新数据,一个用于查询数据:
至此,我们就完成了数据库的封装。我们开始编写API来实现用户登录,并成功生成了token。我们看一下实现的代码:
其实登录逻辑可以分为三步:
1.根据解密规则对参数进行加密,生成签名
2、签名验证成功,数据库验证账号和密码是否匹配。 3、账号和密码匹配生成token并与用户信息一起返回给前端。
我将数据库操作封装到dao层下的users.js中。我们看一下登录数据库的逻辑代码:
登录逻辑现已完成。我们看一下接口的调用效果:
如果调用成功,会生成一个token,并与用户信息一起返回给前端。然后我们实现一个接口来查询用户的个人积分信息。前端调用API时,需要携带token来验证个人信息。
这个界面也分为三个步骤:
1.根据解密规则对参数进行加密,生成签名
2. 签名验证成功。解析token,验证解析出的用户账号与用户传递的账号是否一致。
3、验证数据库操作是否成功,用户积分数据返回前端。
同样,我们将数据库操作封装在dao/users.js下。我们可以看一下数据库逻辑:
我们看一下接口调用的效果:
可以看到我们成功解析token获取用户信息,并查询到用户的积分信息。
事实上,在公司的前后端交互中,我们基本采用的是签名+token+时间戳的验证方式。本文也完整重现了开发接口的整个过程。为了提高代码的可维护性,我们对所有公共方法进行了封装,为后续的产品迭代增加了更多的可能性。
本文源码以及之前的加解密算法源码已上传至码云。下载链接:
https://gitee.com/mqzuimeng/test_code.git
如果喜欢我的文章,请关注我的个人公众号:周老师的私人空间。
推荐阅读
前后端分离交互(一)
【JSON Web Tokens(JWT)生成与解析教程】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个功能看起来很有用!我在开发API的时候经常会用到token认证。
有18位网友表示赞同!
终于找到了解释jsonwebtoken的文章!我一直在想怎么学着用它。
有8位网友表示赞同!
JWT的安全性问题一直很让人头疼,这篇文章能帮我了解一下吗?
有18位网友表示赞同!
学习生成和解析token很重要,我可以写一个更加安全的后端系统了。
有11位网友表示赞同!
最近遇到一个和JWT相关的bug,希望这篇文章可以帮到我。
有6位网友表示赞同!
看来jsonwebtoken是一个很普及的工具,现在就来学一下它的用法吧。
有6位网友表示赞同!
分享你的代码例子会更棒哦!我也想尝试生成和解析token。
有10位网友表示赞同!
我的网站需要验证用户,这篇文章可以帮到吗?
有9位网友表示赞同!
JWT是一种高效的认证方式,学习它能让我写出更好的代码。
有7位网友表示赞同!
这篇博客写的很通俗易懂,即使我不是编程高手也能看懂。
有20位网友表示赞同!
以后开发项目的时候就可以用JWT了!这篇文章让我大开眼界。
有17位网友表示赞同!
希望这篇文章能解释清楚如何使用不同的时间戳来设置token的过期时间。
有9位网友表示赞同!
学习JWT之后可以写出更安全的web应用,感觉很棒啊!
有7位网友表示赞同!
生成和解析token的过程是不是很复杂?看这篇文章应该会简单明了。
有18位网友表示赞同!
看来jsonwebtoken是一个非常强大的工具,以后在开发项目时一定是要学的。
有6位网友表示赞同!
这篇文章涵盖了哪些常用的JWT场景呢?
有20位网友表示赞同!
学习如何验证token的有效性也很重要吧?文章中提到吗?
有13位网友表示赞同!
有没有什么其他的安全机制可以结合使用JWT呢?
有9位网友表示赞同!
希望以后能看到更多关于jwt的文章和教程!
有5位网友表示赞同!