JWT使用

JWT使用

官方网址 https://jwt.io/ (查看RFC 7519建议直接谷歌浏览器翻译中文阅读)

个人觉得比较好的参考 https://www.jianshu.com/p/e9639f386568

本章只简述JWT基本操作 , 后续总结其余所涉技术 [网关Zuul 、Spring Security 、Oauth2 、redis、cookie…]

可以关注完结篇

JWT使用_第1张图片

概述

JSON Web令牌是一种开放的行业标准 RFC 7519方法,用于在双方之间安全地表示声明(JWT将一组声明表示为JSON对象),并且声明被加密 .

优点

  • 易扩展 ,可以在其提供的结构中自定义信息
  • 安全 , 使用非对称加密算法及数字签名技术 , 防止JWT篡改
  • 便捷 , 基于json

缺点

  • 长 , 占存储空间较大

令牌结构

JWT令牌由三部分组成[头.负载.签名] , 使用 (.) 分割 , 官网首页提供demo

  • HEADER:ALGORITHM & TOKEN TYPE
{
  "alg": "HS256", // 哈希算法
  "typ": "JWT"   // 类型
}
// 头 使用Base64Url编码
  • PAYLOAD:DATA
{
  "sub": "1234567890", // (Subject) Claim
  "name": "John Doe", // 自定义信息
  "iat": 1516239022  // (JWT ID) Claim
}
// 负载,提供自定义字段,可解码还原 使用Base64Url编码
  • VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
	your-256-bit-secret  
) 
// 签名,防止JWT篡改
//	secret-签名所使用的密钥

生成私钥和公钥

1、生成密钥证书

// cmd输入下面命令生成密钥证书(公钥+私钥)
keytool -genkeypair -alias xzkey -keyalg RSA -keypass xuezhu -keystore xz.keystore -storepass xuezhukeystore
/** 
	Keytool 是一个java提供的证书管理工具
 	-alias:密钥的别名
	-keyalg:使用的hash算法
	-keypass:密钥的访问密码
	-keystore:密钥库文件名,xz.keystore保存了生成的证书
	-storepass:密钥库的访问密码,可以和-keypass设置一样
*/
/**
	查看证书:keytool -list -keystore xz.keystore
	删除别名:keytool -delete -alias xzkey -keystore xz.keystore
*/

2、导出公钥

使用openssl(加解密工具包)来导出公钥信息

安装地址http://slproweb.com/products/Win32OpenSSL.html

将openssl配置到环境变量path中 , 在xz.keystore所在目录cmd执行下面命令:

keytool -list -rfc --keystore xz.keystore | openssl x509 -inform pem -pubkey

然后输入密钥库口令即可拿到

-----BEGIN PUBLIC KEY-----
	.....
-----END PUBLIC KEY-----
//这一段就是公钥内容,copy到文本文件中,合并一行保存

生成并校验jwt令牌

使用org.springframework.security.jwt.*提供的api

    >
    	>org.springframework.cloud>
    >spring-cloud-starter-security>
    >
    >
    >org.springframework.cloud>
    	>spring-cloud-starter-oauth2>
    >
package com.xuezhu.auth;

import com.alibaba.fastjson.JSON;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.RsaSigner;
import org.springframework.security.jwt.crypto.sign.RsaVerifier;
import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
import org.springframework.test.context.junit4.SpringRunner;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestJwt {
    //测试创建jwt令牌
    @Test
    public void testCreateJwt(){
        //密钥库文件
        String keystore = "xz.keystore";
        //密钥库的密码
        String keystore_password = "xuezhukeystore";
        //密钥库文件路径
        ClassPathResource classPathResource = new ClassPathResource(keystore);
        //密钥别名
        String alias  = "xzkey";
        //密钥的访问密码
        String key_password = "xuezhu";
        //密钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource,keystore_password.toCharArray());
        //密钥对(公钥和私钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, key_password.toCharArray());
        //获取私钥
        RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
        //jwt令牌的内容
        Map<String,String> body = new HashMap<>();
        body.put("name","weizhuang");
        String bodyStr = JSON.toJSONString(body);
        //生成jwt令牌
        Jwt jwt = JwtHelper.encode(bodyStr, new RsaSigner(aPrivate));
        //生成jwt令牌编码
        String encoded = jwt.getEncoded();
        System.out.println(encoded);
    }

    //校验jwt令牌
    @Test
    public void testVerify(){
        //公钥
        String publickey = "-----BEGIN PUBLIC KEY-----aaaaa-----END PUBLIC KEY-----";
        //jwt令牌
        String jwtString = "encoded";
        //校验jwt令牌
        Jwt jwt = JwtHelper.decodeAndVerify(jwtString, new RsaVerifier(publickey));
        //拿到jwt令牌中自定义的内容
        String claims = jwt.getClaims();
        System.out.println(claims);
    }
}

你可能感兴趣的:(认证服务,认证服务,JWT,zuul,SpringSecurity,Oauth2)