JWT验证

一、JWT是什么

JWT即JSON Web Token,是一种认证鉴权方式,一般是用在我们的http接口请求上,将认证信息返回到客户端,储存在客户端,每次的接口调用都需要带上验证信息。

二、JWT的结构

JWT一共分为三个部分,header(头部)、 payload(负载) 和signature(签名)。
JWT的格式如下所示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. header(头部)

header是一个json对象,描述了加密算法的方式及验证方式。通常为如下所示:

{
  "alg": "HS256",
  "typ": "JWT"
}
然后对这个json对象进行base64url的编码。

2. payload(负载)

payload存放的是实际需要传递的数据,可使用官方推荐的字段,也可自定义字段。通常为如下所示:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
// 官方推荐的字段
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

然后对这个json对象进行base64url的编码。

3. signature(签名)

signature主要是对header和payload进行签名,jwt 中常用的签名算法是 HS256,还需要一个用来加密的密钥secret。
具体格式如下:

HS256 (base64url(header) + '.' + base64url(payload), secret)

4.最终格式

将header、payload、signature用“.”连接起来。

base64url(header) + "." + base64url(payload) + "." + signature

base64Url方法:
由于JWT可以放在URL中(例如api.example/?token=xxx)。 由于URL中“+”,“/”,“=”会被转义掉,所以Base64URL中需要对他们做替换,即把"="去掉,"+"用"-"替换,"/"用"_"替换。

三、JWT的使用

成功生成jwt后,可将jwt存在localStorage里,进行http请求时,将信息通过header的Authorization字段携带过去。

四、JWT的验证

服务端接收到jwt字符串后,对jwt进行验证。
以下是node中的其中一种验证方式,直接调用了第三方库jsonwebtoken的方法。

var jwt = require('jsonwebtoken');

jwt.verify(jwtVal, 'your secret', function(err, decoded) {
    console.log('解码----', decoded)
});

/** 使用正确密钥获取到的decoded为 
{
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
}
**/
// 使用错误密钥获取到的decoded为 undefined

除此之外,还可以将header、payload用base64url的方法进行解码,在使用已知密钥进行加密,再将加密后的值与从客户端传来的值进行对比。

五、参考文档

JWT官方文档:https://jwt.io/introduction/
阮一峰JWT教程: https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

你可能感兴趣的:(JWT验证)