jwt定义
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。
组成
由三个部分组成,header.payload.signature
header:令牌头部,记录了整个令牌的类型和签名算法
payload:令牌负荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里
signature:令牌签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改
过程
header:{“alg”:“HS256”,“typ”:“JWT”}
payload:{“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]}
signature:还没生成
header:base64UrlEcode({“alg”:“HS256”,“typ”:“JWT”})
payload:base64UrlEcode({“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]})
signature:HMACSHA256(base64UrlEcode({“alg”:“HS256”,“typ”:“JWT”})+“.”+base64UrlEcode({“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]}),“secret key”)
header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload:eyJyb2xlSWRzIjpbMTAwMSwxMDAyLDEwMDNdLCJ1c2VySWQiOjEsInVzZXJuYW1lIjoiYWxpY2UifQ
signature:tphGcSJcqM2zHhiq-Kx9rtamKX9A8G9jSNsBV-oR9dk
jwt=header.payload.signature
HMACSHA256=HMAC+SHA256
HMAC:Hash-based Message Authentication Code,散列消息认证码–一种带有密钥的哈希摘要算法
SHA256:哈希摘要算法
在线base64Url解码/编码网站:http://www.lzltool.com/base64url
核心类
org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter
org.springframework.security.jwt.JwtHelper
核心方法
//加密
public static Jwt encode(CharSequence content, Signer signer) {
return encode(content, signer, Collections.emptyMap());
}
//解密并验证签名
public static Jwt decodeAndVerify(String token, SignatureVerifier verifier) {
//这一步就把token信息解密为明文的payload,所以payload的信息其实是在知道token后,就可以解析出,故里面不要放敏感信息如 密码等
Jwt jwt = decode(token);
//这一步就是验签,把解密后的payload信息用secret key加密,然后把结果和token的signature比较,相同代表验签通过(表明payload的信息没有被修改和secret key正确),不同就会抛出异常
jwt.verifySignature(verifier);
return jwt;
}
示例
import com.alibaba.fastjson.JSONObject;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.MacSigner;
import java.util.Arrays;
public class JWTDemo {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("username","alice");
jsonObject.put("userId",1);
jsonObject.put("roleIds", Arrays.asList(1001,1002,1003));
String payloadInfo = jsonObject.toJSONString();
//生成jwt
String jwtToken = JwtHelper.encode(payloadInfo , new MacSigner("secret key")).getEncoded();
System.out.println(jwtToken);
//jwt解码和验签
Jwt jwt = JwtHelper.decodeAndVerify(jwtToken , new MacSigner("secret key"));
//claimsStr 就是 payloadInfo
String claimsStr = jwt.getClaims();
System.out.println(claimsStr);
}
}
spring security集成了jwt,按需使用,有兴趣的可以追一下代码