当前位置: 首页 > 后端技术 > Node.js

JSONWEBTOKEN入门

时间:2023-04-03 18:23:05 Node.js

前言在《基于Token的用户认证》中,我们了解了Token认证的基本流程,而JSONWebToken(简称JWT)是目前最流行的基于Token原理的跨域认证方案。本文介绍其原理和用法。JWT的原理JWT的原理:服务端通过认证后,生成一个JSON对象返回给用户,就像下面这样。{"userId":"Xiaohua","role":"admin","lastLoginTime":"2019-11-2419:24:24"}当用户与服务器通信时,必须返回这个JSON对象。服务器完全依赖此对象来验证用户。为保证安全,服务器在生成该对象时,会使用算法生成签名(详见下文)。数据结构JWT的三部分依次如下。HEADER(头部)PAYLOAD(加载)SIGNATURE(签名)写在一行中,如下所示。HEADER.PAYLOAD.SIGNATURE的实际JWT如下所示。它是一个很长的字符串,中间用点(.)分隔成三部分,HEADER和PAYLOAD是JSON对象,都是用base64Url转成字符串。请注意,JWT内部没有换行符。这里分几行写,只是为了展示。HEADER(head)HEADER部分是一个JSON对象,描述了JWT的元数据,一般是这样的:{"alg":"HS256","typ":"JWT"}上面代码中,alg属性表示签名(algorithm)的算法,默认为HMACSHA256(写成HS256);typ属性表示token(令牌)的类型,JWTtoken统一写为JWT。HEADER是一个JSON对象,会使用base64Url算法将其转换为字符串。PAYLOAD(加载)PAYLOAD部分也是一个JSON对象,描述了服务中需要加载的信息,一般是这样的:{"userId":"小花","role":"admin","lastLoginTime":"2019-11-2419:24:24"}PAYLOAD部分也是一个JSON对象,会通过base64Url算法转换为字符串。SIGNATURE(签名)SIGNATURE部分是前两部分的签名,防止数据被篡改。首先需要指定一个key(secret),然后使用Header中指定的签名算法,按照下面的公式生成签名。HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload)+"."+base64UrlEncode(your-256-bit-secret))投入使用用户登录→服务器生成token→客户端存储→用户根据token登录用户通信首次登录,将用户信息发送到服务器生成token。结合用户的基本信息和我们设置的keysecret,通过jsonwebtoken生成token存储。用户收到服务端通过JWT编码返回的token后,token可以存储在cookie中,也可以存储在localStorage中。通信用户每次与服务器通信都必须带上这个token。可以放在cookie里面自动发送,但是这个不能跨域。更好的办法是放在HTTP请求的头信息Authorization字段中。Authorization:Bearer//头信息Authorization字段的另一种做法是,跨域时,JWT放在POST请求的数据体中。参考基于Token的用户认证jsonwebtoken生成和解析token