asarray java,Java
JWT是什么?
JWTs是JSON對象的編碼表示。JSON對象由零或多個名稱/值對組成,其中名稱為字符串,值為任意JSON值。
JWT有助于在clear(例如在URL中)發送這樣的信息,可以被信任為不可讀(即加密的)、不可修改的(即簽名)和URL – safe(即Base64編碼的)。
JWT的定義:
JWT是一種用于雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規范。
JWT作為一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。
因為數字簽名的存在,這些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘鑰對進行簽名。
JWT特點:
簡潔(Compact): 可以通過URL,POST參數或者在HTTP header發送,因為數據量小,傳輸速度也很快
自包含(Self-contained):負載中包含了所有用戶所需要的信息,避免了多次查詢數據庫
JWT構成
JWT主要包含三個部分之間用英語句號’.’隔開
Header 頭部
Payload 負載
Signature 簽名
注意,順序是 header.payload.signature
JWT的負載(Payload)
負載(Payload)為JWT的第二部分。JWT的標準所定義了一下幾個基本字段:
iss: 該JWT的簽發者
sub: 該JWT的使用者
aud: 該JWT的接收者
exp(expires): Unix時間戳 過期時間
iat(issued at): Unix時間戳 簽發時間
Java-Jwt中特別定義Payload
nbf(not before):Unix時間戳 生效時間
jti:JwtID JWT的唯一標識
kid: 返回KeyID
Jwt使用三部曲
添加依賴1
2
3
4
5
com.auth0
java-jwt
3.4.0
生成Jwt創建加密算法實例
HMAC256 表示加密算法 參數為加密密鑰1Algorithm algorithm = Algorithm.HMAC256("securityKey");設置Jwt負載
通過withClaim 或 with 相應熟悉來設置頭負載和負載1JWT.create().withClaim("key", "value")
簽名
通過sign方法進行簽名,需要傳入加密算法實例1
2
3JWT.create().withClaim("key", "value").sign(algorithm);
JWT.create().withClaim("key", "value").sign(Algorithm.HMAC256("securityKey"));
校驗Jwt創建加密算法實例
HMAC256 表示加密算法 參數為加密密鑰1Algorithm algorithm = Algorithm.HMAC256("securityKey");創建校驗器實例
通過傳入加密算法實例來創建校驗器實例1JWTVerifier jwtVerifier = JWT.require(algorithm).build();
在調用build()方法前可添加指定校驗參數
如withSubject()方法,當sub屬性值不為”user”時將拋出異常InvalidClaimException1JWTVerifier jwtVerifier = JWT.require(algorithm).withSubject("user").build();
需要特別注意關于調整校驗簽名時間的幾個方法
acceptLeeway()、acceptExpiresAt()、acceptNotBefore()、acceptIssuedAt()參數為Long類型參數,且必須是正整數,表示調整時間(單位/秒)
acceptLeeway() nbf、iat 和 exp 延遲時間(單位/秒)
acceptExpiresAt() exp 延遲時間(單位/秒)
acceptNotBefore() nbf 延遲時間(單位/秒)
acceptIssuedAt() iat 延遲時間(單位/秒)校驗簽名
jwtVerifier.verify() 校驗器實例方法返回解碼后的結果
如果簽名內容失效則會拋出SignatureVerificationException異常
當頭部信息中包含iat、exp、nbf等屬性時,verify()將自動進行校驗。不包含的屬性不進行校驗。
如JWT時間失效,則會拋出TokenExpiredException異常
異常的父類為JWTVerificationException,可用于JWT失效處理。1
2
3DecodedJWT decodedJWT = jwtVerifier.verify("JWTString");
jwtVerifier.verify("JWTString");
解碼Jwt
首先在調用校驗方法時即可返回解碼后類型為DecodedJWT的解碼結果1DecodedJWT decodedJWT = jwtVerifier.verify("JWTString");
也可以使用decode()方法進行解碼1DecodedJWT decodedJWT = JWT.decode(JwtResoult);
之后便可調用decodedJWT的get方法獲取負載的相關內容
Claim (聲明,斷言的意思)中的asXXX()方法
asBoolean(): 返回 Boolean 值,如果不能轉換則返回null。
asInt(): 返回 Int 值,如果不能轉換則返回null。
asDouble(): 返回 Double 值,如果不能轉換則返回null。
asLong(): 返回 Long 值,如果不能轉換則返回null。
asString(): 返回 String值,如果不能轉換則返回null。
asDate(): 返回 Date值,如果不能轉換則返回null。 必須是一個數字日期 (Unix 系統時間戳)。
注意,JWT標準指定所有的數字日期值必須以秒為單位。
自定義類型和集合:
要獲得作為集合的聲明,您需要提供要轉換的內容的類類型
as(class): 返回指定類型的對象。 對于集合,應該使用asArray和asList方法。
asMap(): 返回被轉換為 Map 的集合
asArray(class): 返回被轉換為 Class [] 的數組,如果轉換失敗則返回null。
asList(class): 返回被轉換為 List的集合,如果轉換失敗則返回null。
由于Java-Jwt默認使用Jackson來處理負載中的Json。所以未進行配置的Jackson可能會由于轉義字符的問題而產生下面的異常。
no String-argument constructor/factory method to deserialize from String value
解決辦法是使用asString()轉換為字符串再使用Json工具進行轉換或者配置Jackson的以下配置
允許出現特殊字符和轉義符:
configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
允許出現單引號:
configure(Feature.ALLOW_SINGLE_QUOTES, true);
總結
以上是生活随笔為你收集整理的asarray java,Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php节点对象,JavaScript_J
- 下一篇: php如何判断多文件上传,php多文件上