最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSON Web Token在登陸中的使用過(guò)程

 更新時(shí)間:2025年04月02日 10:57:15   作者:Xwzzz_  
這篇文章主要介紹了JSON Web Token在登陸中的使用過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

JWT(JSON Web Token)是一種開(kāi)放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用環(huán)境間安全地傳遞聲明。它的主要用途是身份驗(yàn)證和信息交換。

在微服務(wù)架構(gòu)中,JWT 作為認(rèn)證機(jī)制非常常見(jiàn),特別是與 API 網(wǎng)關(guān)結(jié)合使用時(shí)。

JWT 介紹

JWT 是由三部分組成的:

  • Header(頭部):通常包含簽名的算法信息(例如 HMAC SHA256 或 RSA)。
  • Payload(負(fù)載):包含聲明(Claims)。聲明可以是關(guān)于實(shí)體(通常是用戶(hù))的信息,或者元數(shù)據(jù)。JWT 的負(fù)載部分是 base64 編碼的。
  • Signature(簽名):簽名是用來(lái)驗(yàn)證 JWT 數(shù)據(jù)是否被篡改的。它通過(guò)將 header 和 payload 使用私鑰加密生成,確保 JWT 的數(shù)據(jù)安全性和完整性。

微服務(wù)架構(gòu)中的 JWT 使用

在微服務(wù)架構(gòu)中,多個(gè)微服務(wù)通常會(huì)通過(guò) HTTP 請(qǐng)求進(jìn)行交互。如果沒(méi)有合適的認(rèn)證機(jī)制,用戶(hù)的身份驗(yàn)證信息可能會(huì)在多個(gè)服務(wù)之間重復(fù)驗(yàn)證,這不但增加了冗余,也降低了安全性。

JWT 在這種情況下非常有用,因?yàn)樗茉谟脩?hù)登錄時(shí)生成一個(gè)有效的 token,該 token 可以在不同的服務(wù)之間傳遞,而不需要每個(gè)服務(wù)都進(jìn)行用戶(hù)認(rèn)證。

結(jié)合微服務(wù)網(wǎng)關(guān)的 JWT 驗(yàn)證

微服務(wù)網(wǎng)關(guān)(如 Spring Cloud Gateway 或 Nginx)在微服務(wù)架構(gòu)中起到了流量管理、路由、負(fù)載均衡等作用。

JWT 與微服務(wù)網(wǎng)關(guān)結(jié)合時(shí),網(wǎng)關(guān)通常扮演驗(yàn)證用戶(hù)身份的角色。

具體的流程如下:

流程示例

  1. 用戶(hù)登錄:用戶(hù)通過(guò)用戶(hù)名和密碼登錄。后端服務(wù)會(huì)驗(yàn)證這些憑證,如果驗(yàn)證成功,則生成一個(gè) JWT token 返回給前端。
  2. 前端保存 JWT:前端將 JWT 保存在客戶(hù)端(如 localStorage 或 sessionStorage),并在后續(xù)的 API 請(qǐng)求中將其添加到 HTTP 請(qǐng)求的 Authorization 頭中。
  3. 微服務(wù)網(wǎng)關(guān)驗(yàn)證 JWT:用戶(hù)在每次請(qǐng)求時(shí)會(huì)將 JWT 發(fā)送到微服務(wù)網(wǎng)關(guān)。網(wǎng)關(guān)會(huì)驗(yàn)證 JWT 的有效性、簽名、過(guò)期時(shí)間等。如果 JWT 合法,則網(wǎng)關(guān)將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)微服務(wù)。
  4. 微服務(wù)接收請(qǐng)求:微服務(wù)通過(guò)網(wǎng)關(guān)接收到請(qǐng)求時(shí),已經(jīng)可以信任這個(gè)用戶(hù)的身份,無(wú)需再進(jìn)行身份驗(yàn)證。微服務(wù)可以從 JWT 的 Payload 中提取用戶(hù)信息來(lái)處理請(qǐng)求。

1. 用戶(hù)登錄,生成 JWT

public class JwtUtil {

    private static final String SECRET_KEY = "secret";  // 用于加密的秘鑰

    // 生成 JWT
    public static String createJWT(String userName) {
        return Jwts.builder()
                .setSubject(userName)
                .setIssuedAt(new Date())  // 設(shè)置發(fā)放時(shí)間
                .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 設(shè)置過(guò)期時(shí)間,1小時(shí)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)  // 使用 HMAC-SHA256 加密
                .compact();
    }

    // 解析 JWT
    public static Claims parseJWT(String jwt) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

2. 自定義過(guò)濾器來(lái)實(shí)現(xiàn) JWT 的驗(yàn)證

@Component
public class JwtAuthenticationFilter implements GatewayFilter, Ordered {

    private static final String AUTHORIZATION_HEADER = "Authorization";
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst(AUTHORIZATION_HEADER);

        if (token == null || !token.startsWith("Bearer ")) {
            return Mono.error(new RuntimeException("Unauthorized"));
        }

        try {
            String jwt = token.substring(7);  // 去掉 "Bearer " 前綴
            Claims claims = JwtUtil.parseJWT(jwt);  // 解析 JWT
            // 可以根據(jù)解析的 claims 來(lái)做進(jìn)一步的驗(yàn)證或設(shè)置安全上下文
            exchange.getRequest().mutate()
                    .header("User", claims.getSubject())  // 在請(qǐng)求頭中設(shè)置用戶(hù)信息
                    .build();
        } catch (Exception e) {
            return Mono.error(new RuntimeException("Invalid token"));
        }

        return chain.filter(exchange);  // 繼續(xù)處理請(qǐng)求
    }

    @Override
    public int getOrder() {
        return -1;  // 優(yōu)先級(jí),越小越優(yōu)先
    }
}

3. 微服務(wù)中使用 JWT 數(shù)據(jù)

微服務(wù)從網(wǎng)關(guān)接收到請(qǐng)求時(shí),可以直接從請(qǐng)求頭中讀取用戶(hù)信息:

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/info")
    public String getUserInfo(@RequestHeader("User") String userName) {
        // 使用 userName 獲取用戶(hù)信息
        return "Hello, " + userName;
    }
}

總結(jié)

通過(guò)將 JWT 和微服務(wù)網(wǎng)關(guān)結(jié)合使用,可以實(shí)現(xiàn)分布式系統(tǒng)中的統(tǒng)一身份驗(yàn)證。用戶(hù)登錄時(shí)通過(guò) JWT 獲取認(rèn)證信息,網(wǎng)關(guān)負(fù)責(zé)驗(yàn)證 JWT 的有效性和用戶(hù)身份,然后將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的微服務(wù)。微服務(wù)無(wú)需再驗(yàn)證用戶(hù)身份,只需要從 JWT 中提取必要的用戶(hù)信息進(jìn)行業(yè)務(wù)處理。

這種方式有效地減少了重復(fù)認(rèn)證的開(kāi)銷(xiāo),同時(shí)提高了系統(tǒng)的安全性和可擴(kuò)展性。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類(lèi)問(wèn)題

    SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類(lèi)問(wèn)題

    這篇文章主要介紹了SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類(lèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中equals比較方法使用詳解

    Java中equals比較方法使用詳解

    這篇文章主要給大家介紹了關(guān)于Java中equals比較方法使用的相關(guān)資料,在Java中equals()方法是Object類(lèi)的一個(gè)實(shí)例方法,用于比較兩個(gè)對(duì)象是否相等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • kafka內(nèi)外網(wǎng)訪(fǎng)問(wèn)配置方式

    kafka內(nèi)外網(wǎng)訪(fǎng)問(wèn)配置方式

    這篇文章主要介紹了kafka內(nèi)外網(wǎng)訪(fǎng)問(wèn)配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 這一次搞懂Spring的XML解析原理說(shuō)明

    這一次搞懂Spring的XML解析原理說(shuō)明

    這篇文章主要介紹了這一次搞懂Spring的XML解析原理說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java中的繼承詳情

    Java中的繼承詳情

    這篇文章主要介紹了Java中的繼承詳情,繼承是面向?qū)ο笕筇卣髦?,可以使得子?lèi)具有父類(lèi)的屬性和方法,還可以在子類(lèi)中重新定義,以及追加屬性和方法,下文介紹需要的朋友可以參考下
    2022-04-04
  • IDEA2021.2配置docker如何將springboot項(xiàng)目打成鏡像一鍵發(fā)布部署

    IDEA2021.2配置docker如何將springboot項(xiàng)目打成鏡像一鍵發(fā)布部署

    這篇文章主要介紹了IDEA2021.2配置docker如何將springboot項(xiàng)目打成鏡像一鍵發(fā)布部署,本文圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java 微信公眾號(hào)開(kāi)發(fā)相關(guān)總結(jié)

    Java 微信公眾號(hào)開(kāi)發(fā)相關(guān)總結(jié)

    公眾號(hào)作為主流的自媒體平臺(tái),有著不少人使用。這次以文本回復(fù)作為案例來(lái)講解Java相關(guān)的微信公眾號(hào)開(kāi)發(fā)
    2021-05-05
  • 使用Java實(shí)現(xiàn)動(dòng)態(tài)生成MySQL數(shù)據(jù)庫(kù)

    使用Java實(shí)現(xiàn)動(dòng)態(tài)生成MySQL數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)動(dòng)態(tài)生成MySQL數(shù)據(jù)庫(kù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • SpringBoot實(shí)現(xiàn)Word轉(zhuǎn)PDF和TXT的實(shí)踐分享

    SpringBoot實(shí)現(xiàn)Word轉(zhuǎn)PDF和TXT的實(shí)踐分享

    研發(fā)工作中難免會(huì)遇到一些奇奇怪怪的需求,就比如最近,客戶(hù)提了個(gè)新需求:上傳一個(gè)WORD文檔,要求通過(guò)系統(tǒng)把該文檔轉(zhuǎn)換成PDF和TXT,所以本文給大家分享了SpringBoot實(shí)現(xiàn)Word轉(zhuǎn)PDF和TXT的實(shí)踐,感興趣的朋友可以參考下
    2024-08-08
  • SpringBoot中的異步執(zhí)行方法詳解

    SpringBoot中的異步執(zhí)行方法詳解

    這篇文章主要介紹了SpringBoot中的異步執(zhí)行方法詳解,ThreadpoolTaskExecutor不需要手動(dòng)的創(chuàng)建當(dāng)前線(xiàn)程池,但往往我們還是會(huì)手動(dòng)指定,具體原因看源碼就可以自有判斷,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

商洛市| 天水市| 赤水市| 靖安县| 赞皇县| 马鞍山市| 通海县| 京山县| 兴化市| 池州市| 文登市| 武胜县| 青岛市| 虹口区| 凭祥市| 丰都县| 绥化市| 纳雍县| 虎林市| 收藏| 河源市| 萍乡市| 鹿泉市| 界首市| 原平市| 革吉县| 苏州市| 遵义市| 苗栗市| 西林县| 凤庆县| 肃宁县| 新乡市| 康定县| 威信县| 嘉义县| 乌拉特中旗| 蛟河市| 郓城县| 桑日县| 电白县|