jwt簡介
jwt即json-web-token。目前比較流行的跨域身份校驗方案。算是比較輕量級的解決方案。
jwt以"."爲分隔符分爲三個部分。第1部分:header 包含加密類型,消息類型等。payload(載荷):包含發佈人,有效期,簽發人等信息。第3部分VERIFY SIGNATURE,把將前兩部分進行base64Url編碼,然後加上用指定祕鑰指定加密算法生成的加密字符串。構成第三部分。
落地場景
- 簡單SSO
- API鑑權
- 其他跨域身份校驗
簡單實例
- Pom文件引入java-jwt。
其中注意java-jwt本身使用2.0以後的jackson版本com.fasterxml.jackson.core實現。避免與老版本jackson(org.codehaus.jackson衝突)。
本身經驗而言:共存的狀態下使用老版的@JsonIgnoreProperties會失效。Spring3.0使用org.codehaus.jackson解析返回的json數據。
<!-- jwt json web TOKEN -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
- 生成jwt
public static String createToken(String userId) {
//jwt生命週期
long lifeTime = Long.parseLong(OperatePropertiesUtil.readValue("config.properties", "jwt_lifetime") );
Date start = new Date();
//單位爲毫秒60*60*1000爲1小時
long currentTime = System.currentTimeMillis() + lifeTime;
Date end = new Date(currentTime);
String token = "";
//加密的祕鑰需要客戶端 服務端一致。(根據加密算法不同調整)
String secret = OperatePropertiesUtil.readValue("config.properties", "jwt_secret") ;
//userId爲業務相關校驗使用。
token = JWT.create().withAudience(userId).withIssuedAt(start).withExpiresAt(end)
.sign(Algorithm.HMAC256(secret));
return token;
}
- 服務端校驗jwt
使用載荷中有效信息進行業務方面校驗(不需要的話可省略)
比如:
String userId = JWT.decode(token).getAudience().get(0);
然後jwt本身校驗:
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(ConstUtil.JWT_SECRET)).build();
try {
jwtVerifier.verify(token);
} catch (JWTVerificationException e) {
LOGGER.error("token校驗失敗:"+e.getMessage());
}
大概流程: