一、什麼是JWT
JSON Web Token(JWT)是一種用於安全傳輸信息的開放標準,基於 JSON 格式定義了一種緊湊且自包含的方式來在各方之間安全地傳輸信息。JWT 可以被用作驗證身份、信息交換的 token。
一個 JWT 由三個部分組成,分別是頭部(Header)、載荷(Payload)和簽名(Signature):
{
"alg": "HS256",
"typ": "JWT"
}
.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
其中,頭部和載荷都是 JSON 格式,簽名是根據特定算法生成的字符串,用於驗證 JWT 的可靠性。JWT 的優勢在於它既可以存放認證信息,又可以存放其他的業務信息,而且用戶信息都加密存儲,不需要每次都從數據庫中讀取用戶信息。
二、JWT的使用場景
下面列舉了一些 JWT 的常見使用場景:
- 用戶身份驗證:用戶登錄後服務器返回 JWT,客戶端之後訪問其他接口時攜帶 JWT 作為鑒權憑證。
- 應用程序授權:JWT 用於應用程序內部接口的鑒權授權,例如微服務內部的接口訪問。
- 密碼重置/郵箱驗證等場景:發送 JWT 至用戶郵箱或者手機,使用 JWT 驗證用戶身份並執行相應的操作。
三、實現JWT in Java
首先,我們需要添加相關依賴:
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
接下來,我們可以創建一個 JWTUtil 來處理操作 JWT:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
public class JWTUtil {
/**
* 根據用戶信息生成 jwt
*/
public static String generateToken(User user) {
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder builder = Jwts.builder()
.setId(user.getId())
.setIssuedAt(now)
.setSubject(user.getName())
.setIssuer(user.getName())
.signWith(key);
long ttlMillis = 86400000L; //過期時間為1天
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
return builder.compact();
}
/**
* 根據 jwt 解析用戶信息
*/
public static User parseToken(String token) {
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
User user = new User();
user.setId(claims.getId());
user.setName(claims.getSubject());
return user;
}
}
四、使用 JWT 進行授權認證
在使用 JWT 進行授權認證時,通常需要將 JWT 存儲在客戶端(如瀏覽器)中,這樣可以在下次訪問時帶上 JWT,從而進行認證。下面是一個使用 JWT 進行授權認證的示例:
@GetMapping("/users/me")
public ResponseEntity currentUser(@RequestHeader(value="Authorization") String token) {
// 從請求頭中獲取 JWT
if (token.startsWith("Bearer ")) {
token = token.substring(7);
}
// 驗證 JWT 並獲取用戶信息
User user = JWTUtil.parseToken(token);
if (user != null) {
return ResponseEntity.ok(user);
}
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
結語
JWT 是一種非常實用的鑒權方式,它具有跨語言、解耦合等優點。在 Java 中,我們可以使用 jjwt 庫來操作 JWT,可以將其用於接口鑒權、用戶身份認證等場景。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/227756.html
微信掃一掃
支付寶掃一掃