JSON Web Token
- 使用对称或非对称算法对数据进行加密,生成token返回客户端,客户端请求时将token发送给服务端,服务端对token进行校验解密。
- 构成:
headers+payload+signtuare
例如如下token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VybmFtZSI6InpodWFuZyIsInBhc3N3b3JkIjoiMTIzNDU2IiwiaWF0IjoxNzA5NjAwODg2LCJleHAiOjE3MDk2MDI2ODZ9
.odLJNs9MFca7sqfFQn12QOF3jcG3X-mpWQ7S-zIWm44
header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
是对{"alg":"HS256","typ":"JWT"}
的base64编码。
payload: 同样也是经过base64编码
signature:对payload进行加密生成的签名。
如果客户端篡改了token,那么服务端使用同样的密钥(secret一般是对称解密HS256的密钥,publicKey是非对称解密RS256的公钥,privateKey是私钥,一般默认是对称解密secret)解密会失败,验证失效。
由于payload部分是可以通过base64解码的,所以payload不要存敏感信息,这里password只是举例子。
服务端解密token之后返回的payload会带上
3. 签发时的配置
const payload = this.jwtService.sign({
username:'zhuang',
password:"123456",
},{
secret:'xxxxx',
signOptions:{
secret:"xxx",
expiresIn: '30m',// 对应解密后的payload里的exp
subject:"token",
issuer:"zhuang",
audience:'audience',
notBefore:"7d",
jwtid:""
}
})