网站天下,网站建设 辉煌电商,wordpress修改后台,wordpress网站正在建设中认识并使用JWT 一、互联网世界的用户认证二、对JWT的基本认知三、JWT的原理1 Header2 Payload3 Signature4 [参考资料](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) 四、使用JWT1、引入依赖2、jwt的生成与解析3、测试3.1 生成jwt3.2 解析jwt 一、互… 认识并使用JWT 一、互联网世界的用户认证二、对JWT的基本认知三、JWT的原理1 Header2 Payload3 Signature4 [参考资料](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) 四、使用JWT1、引入依赖2、jwt的生成与解析3、测试3.1 生成jwt3.2 解析jwt 一、互联网世界的用户认证
以调用openai的api为例
curl https://api.openai.com/v1/chat/completions -H Content-Type: application/json -H Authorization: Bearer $OPENAI_API_KEY -d {model: gpt-3.5-turbo,messages: [{role: system,content: You are a poetic assistant, skilled in explaining complex programming concepts with creative flair.},{role: user,content: Compose a poem that explains the concept of recursion in programming.}]}Authorization: Bearer $OPENAI_API_KEY其中$OPENAI_API_KEY便是用于用户认证的token。那用户怎么获取这个token呢 一般咱先通过用户名和密码登录网站然后网站分配一个token。在Java中有JWT技术来实现这种需求。
二、对JWT的基本认知
JWTJSON Web Token 我理解将json格式的数据转换为在Web中用于用户认证的token。 JWT是一种基于Token的用户认证技术。思路当用户登录时服务器会创建一个包含用户信息的JWT并将其发送回用户。然后用户可以使用该Token来进行后续的授权请求。在每次请求中服务器都会验证JWT来确认用户的身份然后才会处理请求。
三、JWT的原理
JWT由三部分组成头部Header、载荷Payload和签名Signature。
1 Header
Header 部分原本是一个 JSON 对象用于描述 JWT 的元数据如下所示
{alg: HS256,typ: JWT
}1alg属性表示签名的算法默认是 HMAC SHA256写成 HS256 2typ属性表示这个令牌token的类型JWT统一写为JWT。 2 Payload
Payload 部分原本也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。 1 iss (issuer)签发人 2exp (expiration time)过期时间 3sub (subject)主题 4aud (audience)受众 5nbf (Not Before)生效时间 6iat (Issued At)签发时间 7jti (JWT ID)编号 除了官方字段咱还可以在这个部分定义私有字段如下所示
{name: Forrest,admin: true
}注意不要把秘密信息放在这个JSON对象中因为通常这个JSON对象被转换为字符串后默认是不加密的这就会被别人解析回JSON对象里面的信息就暴露了。 3 Signature
Signature 部分是对前两部分的签名防止数据篡改。首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名
HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),secret)算出签名以后把 Header、Payload、Signature 三个部分拼成一个字符串每个部分之间用点.分隔就可以返回给用户。
4 参考资料
四、使用JWT
1、引入依赖
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version
/dependency还必须引入
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.11.3/version
/dependency
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.11.3/version
/dependency否则会报错 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature at com.fasterxml.jackson.databind.ObjectMapper.init(ObjectMapper.java:656) at com.fasterxml.jackson.databind.ObjectMapper.init(ObjectMapper.java:558) … 2、jwt的生成与解析
public class JwtUtils {private static final String secret IntelliJ IDEA;// 7天有效期public static final long EXPIRE_TIME 1000 * 60 * 60 * 24 * 7;/*** 生成jwt*/public static String encode(MapString, Object headerMap, MapString, Object playloadMap) {return Jwts.builder().setHeader(headerMap).setClaims(playloadMap).signWith(SignatureAlgorithm.HS256, secret).compact();}/*** 解析jwt*/public static MapString, Object decode(String jwt) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(jwt).getBody();}
}3、测试
3.1 生成jwt
Test
public void testEncode() {MapString, Object headerMap new HashMap();headerMap.put(type, JWT);headerMap.put(alg, HS256);MapString, Object playloadMap new HashMap();playloadMap.put(username, Forrest);playloadMap.put(exp, System.currentTimeMillis() JwtUtils.EXPIRE_TIME);playloadMap.put(jti, UUID.randomUUID().toString());for (Map.EntryString, Object entry : playloadMap.entrySet()) {System.out.println(Key entry.getKey() , Value entry.getValue());}String jwt JwtUtils.encode(headerMap, playloadMap);System.out.println(jwt);
}Key exp, Value 1706023265921 Key jti, Value c212fde2-abf4-4149-9c48-c55c1a029e79 Key username, Value Forrest eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJleHAiOjE3MDYwMjMyNjU5MjEsImp0aSI6ImMyMTJmZGUyLWFiZjQtNDE0OS05YzQ4LWM1NWMxYTAyOWU3OSIsInVzZXJuYW1lIjoiRm9ycmVzdCJ9.t-rnO5CgC5DuNShsWIHxu_HKAgIU75tDQnlDcIBCmm0 3.2 解析jwt
Test
public void testDecode() {String jwt eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJleHAiOjE3MDYwMjI3MzM2MTUsImp0aSI6ImFkMTRiZDEyLWNlN2EtNDBjNi1iYTJkLWU0MDllMTY4ZjIwYyIsInVzZXJuYW1lIjoiRm9ycmVzdCJ9.NuNW5PckkwWpFRobreKjrU6pDdosHnc3J2KhwxFW4xU;MapString, Object map JwtUtils.decode(jwt);for (Map.EntryString, Object entry : map.entrySet()) {System.out.println(Key entry.getKey() , Value entry.getValue());}
}Key exp, Value 1706023265921 Key jti, Value c212fde2-abf4-4149-9c48-c55c1a029e79 Key username, Value Forrest