面试题答案
一键面试JWT基本组成结构
- Header(头部):通常由两部分组成,令牌的类型(如JWT)和所使用的签名算法,如HMAC SHA256或RSA。它以JSON对象表示,例如:
{
"alg": "HS256",
"typ": "JWT"
}
之后这个JSON对象会使用Base64Url编码,形成JWT的第一部分。 2. Payload(负载):也是一个JSON对象,用于存放实际需要传递的数据,即声明(claims)。这些声明可以是用户相关信息、权限信息等。分为三种类型:注册声明(如iss,exp,sub等)、公共声明和私有声明。例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
同样,这个JSON对象也会使用Base64Url编码,形成JWT的第二部分。 3. Signature(签名):为了创建签名部分,需要使用编码后的header、编码后的payload、一个密钥(secret)和header中指定的签名算法。例如,如果使用HMAC SHA256算法,签名会按如下方式创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证消息在传输过程中没有被更改,并且,当使用私钥签名时,还可以验证JWT的发送者的身份。
在物联网设备场景下利用JWT实现简单身份认证和授权机制
- 身份认证:
- 设备注册:物联网设备首次接入系统时,在服务器端进行注册,服务器为设备分配唯一标识和密钥(secret)。
- 生成JWT:设备需要访问系统资源时,使用分配的密钥对包含设备标识等信息的payload进行签名,生成JWT。例如,payload可以包含设备ID、设备类型等信息。
- 认证请求:设备将生成的JWT发送到服务器进行认证。
- 服务器验证:服务器接收到JWT后,使用与设备共享的密钥,按照相同的签名算法对JWT的header和payload进行签名计算,并与JWT中的签名部分进行对比。如果一致,则认证通过,表明设备身份合法。
- 授权机制:
- 权限定义:在服务器端定义不同设备类型或设备个体的权限,如哪些设备可以读取特定传感器数据,哪些设备可以控制执行器等。这些权限信息可以作为JWT payload中的声明。
- JWT传递权限:当设备生成JWT时,将相应的权限信息包含在payload中。
- 权限验证:服务器接收到设备的请求及JWT后,在认证通过的基础上,检查JWT payload中的权限声明,判断设备是否有权限执行请求的操作。如果权限匹配,则允许操作;否则,拒绝请求。