今天就跟大家聊聊有关如何在节点中利用koa2实现一个JWT鉴权功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
JWT简介
什么是JWT
全称<代码> JSON Web标记> 代码,是目前最流行的跨域认证解决方案。基本的实现是服务端认证后,生成一个JSON <代码> 代码>对象,发回给用户。用户与服务端通信的时候,都要发回这个JSON代码> <代码>对象。
该JSON <代码> 代码>类似如下:
{ ,“姓名“:,“张三“, ,“角色,:,“管理员“, ,“到期时间,:,“,2018年7月1日0点0分, }
为什么需要JWT
先看下一般的认证流程,基于<代码> session_id 代码>和<代码>饼干代码>实现
1,用户向服务器发送用户名和密码。
2,服务器验证通过后,在当前对话(<代码>会话> 代码)里面保存相关数据,比如用户角色,登录时间等等。
3,服务器向用户返回一个<代码> session_id> 代码,写入用户的<代码>饼干代码>。
4,用户随后的每一次请求,都会通过<代码>饼干> 代码,将<代码> session_id> 代码传回服务器。
5,服务器收到<代码> session_id> 代码,找到前期保存的数据,由此得知用户的身份。
但是这里有一个大的问题,假如是服务器集群,则要求会话数据共享,每台服务器都能够读取会议。这个实现成本是比较大的。
而<代码> JWT> 代码转换了思路,将JSON <代码> 代码>数据返回给前端的,前端再次请求时候将数据发送到后端,后端进行验证。也就是服务器是无状态的,所以更加容易拓展。
JWT的数据结构
<代码> JWT> 代码的三个部分依次如下:
<代码>头> 代码(头部),类似如下
{ ,“alg":,“HS256" ,“typ":“JWT" }
<代码> alg 代码>属性表示签名的算法(<代码>算法> 代码),默认是<代码> HMAC SHA256> 代码(写成<代码> HS256> 代码)。<代码> typ 代码>属性表示这个令牌(<代码>标记> 代码)的类型(<代码>类型> 代码),<代码> JWT 代码>令牌统一写为<代码> JWT 代码>
<代码>有效载荷> 代码(负载)。也是一个JSON <代码> 代码,用来存放实际需要传递的数据。<代码> JWT> 代码规定了7个官方字段。如下所示
- <李>
iss(发行人):签发人
李> <李>exp(过期时间):过期时间
李> <李>子(主题):主题
李> <李>澳元(观众):受众
李> <李>nbf之前(不):生效时间
李> <李>iat(发布):签发时间
李> <李>jti (JWT ID):编号
李>当然也可以自定义私有字段。但是要注意,JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
<代码> 代码签名(签名)。<代码> 代码签名部分是对前两部分的签的名,防止数据篡改。首先,需要指定一个密钥(<代码>秘密> 代码)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用<代码>头> 代码里面指定的签名算法(默认是<代码> HMAC SHA256> 代码),按照下面的公式产生签名。
HMACSHA256 ( ,base64UrlEncode(头),+,“干净+ ,base64UrlEncode(载荷), 以前,秘密)>算出签名以后,把<代码>头代码>,<代码>有效载荷> 代码,<代码> 代码签名三个部分拼成一个字符串,每个部分之间用“点”(。)分隔,就可以返回给用户。如下所示
JWT 的安全
JWT
默认是不加密,但也是可以加密的。JWT
不加密的情况下,不能将秘密数据写入JWT
JWT
本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT
的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证为了减少盗用,
JWT
不应该使用HTTP
协议明码传输,要使用HTTPS
协议传输
Node 简单demo—— Koa JWT 的实现
说完理论知识,我们来看下如何实现 JWT
,大致的流程如下: