JWT(JSON Web Token)是一种用于身份验证的开放标准,它可以将一些有用的信息封装到一个安全的、符合 JSON 格式的字符串中,因此在网络传输中比较常见。
一、JWT的生成方式
JWT 的生成分为以下三个步骤:
1、Header(头部信息):JWT 头部用于描述关于该 JWT 的最基本的信息,例如其类型以及所使用的加密算法等,基本上是固定的内容,格式如下:
{ "alg": "HS256", "typ": "JWT" }
2、Payload(荷载):JWT 的有效载荷部分主要为我们需要之间需要传递的信息,如用户ID、用户名、密码等数据信息。它的格式也是一个 JSON 对象,分为注册声明,公共声明和私有声明三种,注册声明建议(但不强制)要求使用,公共声明和私有声明可以根据需求加入。例如:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
3、Signature(签名):在生成签名时,你需要指定一个密钥,这个密钥只有服务器能够知道,然后使用你在 header 中指定的算法(例如 HS256),将 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的结果进行加密处理,生成签名。签名可以保证 JWT 的可靠性。例如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
这三个基本的步骤是使用 JWT 的最基本的手动实现方式,但是,现在有很多成熟的 JWT 库可以用来生成 JWT。
二、在线生成
如果你只是想在线生成一些简单的 JWT,可以使用在线工具,例如 jwt.io。具体操作可以参考以下步骤:
1、打开jwt.io
2、设置Header信息
在左侧的输入框中输入JWT的Header信息,jwt.io会自动解析 Header 的内容,生成一个JSON格式的Header数据。
{ "alg": "HS256", "typ": "JWT" }
3、设置Payload信息
在下方的输入框中输入JWT的Payload信息,该块作为JWT用户身份信息的载体。以上图为例:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
4、设置Secret信息和Alg算法
在jwt.io右侧的输入框中,填入具体的加密算法和Secret。例如选择HS256加密方式,输入密钥“123456”,jwt.io会自动为您生成JWT Token结果,从而验证一下填入的信息是否正确。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 123456 )
三、自行开发JWT生成工具
当我们需要定制自己的JWT生成流程时,可以使用第三方工具库生成。下面示范一下如何使用 jsonwebtoken 库来生成一组 JWT:
1、安装 jsonwebtoken
npm install jsonwebtoken
2、引用 jsonwebtoken
const jwt = require('jsonwebtoken');
3、生成一个 JWT
const token = jwt.sign({ foo: 'bar' }, 'shhhhh');
上面代码生成一个 JWT。第一个参数是 Payload 提供的信息对象,第二个是一个密钥(字符串格式)。
jsonwebtoken 还允许你添加选项,详见 jsonwebtoken 的官方文档。相较于手动生成方式,使用第三方工具库可以使开发更加方便,并且对于安全问题,第三方工具库也一定程度上提供了保障。
四、小结
JWT 能够保证数据传输的安全性,同时具有数据简洁,低成本的特性。在线JWT生成工具可以帮助我们快速生成JWT,而自行开发 JWT 生成工具则可以根据业务需求实现自定义的生成需要,更加便捷。总体而言,这是一个十分实用的安全工具。