Token相關設計

文章目錄

    • 1. 雙Token 機制概述
      • 1.1 訪問令牌(Access Token)
      • 1.2 刷新令牌(Refresh Token)
    • 2. 雙Token 認證流程
    • 3. Spring Boot 具體實現
      • 3.1 生成 Token(使用 JWT)
      • 3.2 解析 Token
      • 3.3 登錄接口(返回雙 Token)
      • 3.4 刷新 Token 接口
      • 3.5 退出登錄
    • 4. 總結 🚀

在微服務架構中,Token 認證是保障系統安全性的重要手段,常見的方式包括 JWT(JSON Web Token)基于 Redis 的 Token 認證。本文將介紹 雙Token 機制 及其具體實現。


1. 雙Token 機制概述

1.1 訪問令牌(Access Token)

  • 用途:前端每次請求攜帶該令牌,用于身份認證。
  • 有效期:較短(如10分鐘 - 2小時)。
  • 存儲方式:前端存儲(如 LocalStorage、SessionStorage、HTTP Only Cookie)。
  • 信息載荷:用戶 ID、權限、過期時間等。

1.2 刷新令牌(Refresh Token)

  • 用途:用于獲取新的 Access Token,避免用戶頻繁登錄。
  • 有效期:較長(如7天 - 30天)。
  • 存儲方式:數據庫或 Redis(不能存儲在前端,防止濫用)。
  • 信息載荷:用戶 ID,僅用于重新獲取 Access Token。

2. 雙Token 認證流程

  1. 用戶登錄

    • 用戶提交用戶名、密碼。
    • 后端校驗通過后,生成 Access Token(短期) 和 Refresh Token(長期)。
    • Access Token 通過 JWT 方式返回給前端
    • Refresh Token 存儲到數據庫或 Redis,避免前端篡改。
  2. 請求 API 資源

    • 前端在每次請求時,攜帶 Authorization: Bearer <Access Token>
    • 后端解析 Access Token,校驗有效性。
    • 通過則返回資源,失敗則根據錯誤碼處理(如 401 Unauthorized)。
  3. Token 過期時的處理

    • Access Token 過期,但 Refresh Token 仍有效 :

      • 前端調用 刷新接口,攜帶 Refresh Token 請求新 Access Token。
      • 后端驗證 Refresh Token 后,重新生成 Access Token 并返回。
    • Refresh Token 過期或無效:

      • 需要用戶重新登錄。
  4. 用戶登出

    • 后端刪除 Refresh Token 記錄。
    • 前端刪除 Access Token。

3. Spring Boot 具體實現

3.1 生成 Token(使用 JWT)

import io.jsonwebtoken.*;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY = "your_secret_key";private static final long ACCESS_TOKEN_EXPIRATION = 2 * 60 * 60 * 1000; // 2小時private static final long REFRESH_TOKEN_EXPIRATION = 7 * 24 * 60 * 60 * 1000; // 7天// 生成 Access Tokenpublic static String generateAccessToken(String userId) {return Jwts.builder().setSubject(userId).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}// 生成 Refresh Tokenpublic static String generateRefreshToken(String userId) {return Jwts.builder().setSubject(userId).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRATION)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}
}

3.2 解析 Token

public static Claims parseToken(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
}

3.3 登錄接口(返回雙 Token)

@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public Map<String, String> login(@RequestBody LoginRequest request) {// 1. 校驗用戶名和密碼(省略)// 2. 生成 TokenString accessToken = JwtUtil.generateAccessToken(request.getUsername());String refreshToken = JwtUtil.generateRefreshToken(request.getUsername());// 3. 存儲 Refresh Token(示例使用 Redis)redisTemplate.opsForValue().set("refresh_token:" + request.getUsername(), refreshToken, 7, TimeUnit.DAYS);// 4. 返回 TokenMap<String, String> tokens = new HashMap<>();tokens.put("accessToken", accessToken);tokens.put("refreshToken", refreshToken);return tokens;}
}

3.4 刷新 Token 接口

@PostMapping("/refresh")
public ResponseEntity<Map<String, String>> refresh(@RequestHeader("Authorization") String refreshToken) {// 1. 校驗 Refresh TokenClaims claims = JwtUtil.parseToken(refreshToken);String userId = claims.getSubject();// 2. 檢查 Redis 是否存儲該 Refresh TokenString storedToken = redisTemplate.opsForValue().get("refresh_token:" + userId);if (storedToken == null || !storedToken.equals(refreshToken)) {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}// 3. 生成新的 Access TokenString newAccessToken = JwtUtil.generateAccessToken(userId);// 4. 返回新的 TokenMap<String, String> tokens = new HashMap<>();tokens.put("accessToken", newAccessToken);return ResponseEntity.ok(tokens);
}

3.5 退出登錄

@PostMapping("/logout")
public ResponseEntity<Void> logout(@RequestHeader("Authorization") String accessToken) {Claims claims = JwtUtil.parseToken(accessToken);String userId = claims.getSubject();// 刪除 Redis 中的 Refresh TokenredisTemplate.delete("refresh_token:" + userId);return ResponseEntity.ok().build();
}

4. 總結 🚀

機制作用過期時間存儲位置
Access Token用于 API 認證短(10分鐘-2小時)前端 LocalStorage/SessionStorage
Refresh Token用于刷新 Access Token長(7天-30天)Redis/數據庫
  • 雙 Token 機制 既保證了安全性(短期有效的 Access Token)又提升了用戶體驗(長期有效的 Refresh Token)。
  • Access Token 過期時,通過 Refresh Token 重新獲取,而無需重新登錄。
  • Refresh Token 需要存儲在后端(如 Redis),避免前端泄露。

博客主頁: 總是學不會.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70914.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP 請求時傳遞多部分表單數據

HTTP 請求時傳遞多部分表單數據&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基礎關鍵_013_日期處理

目 錄 一、傳統 API 1.System.currentTimeMillis() &#xff08;1&#xff09;說明 &#xff08;2&#xff09;實例 2.構造方法 &#xff08;1&#xff09;說明 &#xff08;2&#xff09;無參構造 &#xff08;3&#xff09;有參構造 3.日期格式化 &#xff08;1&am…

51單片機中reg52.h與regx52.h在進行位操作時的不同

reg52.h中不能使用例如 P2_0;這樣的定義 而只能使用 P2^0;這樣的定義 但是都不可以對位進行直接賦值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下劃線的才可以對位進行賦值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 語言中&#xff0c;…

基于Rook的Ceph云原生存儲部署與實踐指南(上)

#作者&#xff1a;任少近 文章目錄 1 Ceph環境準備2 rook部署ceph群集2.1 Rook 幫助地址2.2 安裝ceph2.3 獲取csi鏡像2.4 Master參加到osd2.5 設置默認存儲 3 Rook部署云原生RBD塊存儲3.1 部署storageclass資源3.2 部署WordPress使用RBD3.3 WordPress訪問 4 Rook部署云原生RGW…

FastExcel與Reactor響應式編程深度集成技術解析

一、技術融合背景與核心價值 在2025年企業級應用開發中&#xff0c;大規模異步Excel處理與響應式系統架構的結合已成為技術剛需。FastExcel與Reactor的整合方案&#xff0c;通過以下技術協同實現突破性性能&#xff1a; 內存效率革命&#xff1a;FastExcel的流式字節操作與Re…

DeepSeek R1/V3滿血版——在線體驗與API調用

前言&#xff1a;在人工智能的大模型發展進程中&#xff0c;每一次新模型的亮相都宛如一顆投入湖面的石子&#xff0c;激起層層波瀾。如今&#xff0c;DeepSeek R1/V3 滿血版強勢登場&#xff0c;為大模型應用領域帶來了全新的活力與變革。 本文不但介紹在線體驗 DeepSeek R1/…

Spring Data JPA 中的分頁實現:從 BasePage 到 Pageable

文章目錄 Spring Data JPA 中的分頁實現&#xff1a;從 BasePage 到 Pageable背景&#xff1a;為什么需要分頁&#xff1f;認識 BasePage 類深入 toPageable() 方法1. 處理頁碼和頁面大小2. 處理排序方向3. 處理排序字段4. 生成 Pageable 對象 實戰&#xff1a;如何使用 BasePa…

Android Studio 新版本Gradle發布本地Maven倉庫示例

發布代碼到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 倉庫發布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…

python量化交易——金融數據管理最佳實踐——qteasy創建本地數據源

文章目錄 qteasy金融歷史數據管理總體介紹本地數據源——DataSource對象默認數據源查看數據表查看數據源的整體信息最重要的數據表其他的數據表 從數據表中獲取數據向數據表中添加數據刪除數據表 —— 請盡量小心&#xff0c;刪除后無法恢復&#xff01;&#xff01;總結 qteas…

Android中使用Robolectric測試點擊事件(不需要手機)

文章目錄 一、前言二、簡單示例三、參考文檔 一、前言 Robolectric 是一個由 Google 維護的開源 Android 測試框架&#xff0c;它允許你以 Android 運行時環境運行單元測試。 Robolectric 提供了一個模擬 Android 運行時環境&#xff0c;允許你測試你的代碼是否正確地使用 And…

Spring Boot 接口 JSON 序列化優化:忽略 Null 值的九種解決方案詳解

一、針對特定接口null的處理&#xff1a; 方法一&#xff1a;使用 JsonInclude 注解 1.1 類級別&#xff1a;在接口返回的 ?DTO 類或字段? 上添加 JsonInclude 注解&#xff0c;強制忽略 null 值&#xff1a; 類級別&#xff1a;所有字段為 null 時不返回 JsonInclude(Js…

ds回答-開源llm應用開發平臺

以下是幾個著名的開源 LLM 應用開發平臺&#xff0c;涵蓋不同場景和技術特點&#xff1a; 1. Dify 特點&#xff1a;低代碼 / 無代碼開發、支持 RAG 檢索、Agent 智能體、模型管理、LLMOps 全流程優化。核心功能&#xff1a;可視化工作流編排、數百種模型兼容&#xff08;如 GP…

LDR6020 PD3.1 協議芯片在特定設備中的應用

在電子設備互聯互通的時代&#xff0c;芯片技術成為提升設備性能與功能的關鍵驅動力。LDR6020 PD3.1 協議芯片以其出色的性能&#xff0c;在 TYPE-C 臺式顯示器 / 便攜顯示器、一拖二快充線以及手機電腦轉接器等設備中展現出獨特價值&#xff0c;為用戶帶來更便捷、高效的使用體…

wzl-django學習

####################################################總的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…

python -ssh學習

def exe_sshcmd(ip,username,userpswd,port,cmd): """ 功能&#xff1a;SSH登錄到指定設備&#xff0c;并執行對應的命令 入參&#xff1a;前四項為ssh登錄shell的ip和port&#xff0c;具備管理員權限的用戶名和密碼&#xff0c; cmd可以…

PDF處理控件Aspose.PDF教程:使用 Python 將 PDF 轉換為 TIFF

TIFF文件是高質量圖像的首選。它們廣泛用于印刷、存檔和圖形設計。企業通常需要轉換PDF文檔以獲得更好的兼容性。了解如何以編程方式執行此轉換可以節省時間和資源。在這篇教程中&#xff0c;我們將探討如何使用 Python 將 PDF 轉換為 TIFF。 本文涵蓋以下主題&#xff1a; P…

服務器IPMI用戶名、密碼批量檢查

背景 大規模服務器部署的時候&#xff0c;少不了較多的網管和監測平臺&#xff0c;這些平臺會去監控服務器的性能、硬件等指標參數&#xff0c;為了便于管理和控制&#xff0c;則需要給服務器IPMI帶外管理添加較多的用戶&#xff0c;這就需要對較多的服務器檢查所對應的IPMI用…

< 自用文兒 > Gobuster 暴力掃描工具與 SecLists 安全測試詞表集合

Ethice 道德問題 GFW 的保護下&#xff0c;很多的設備操作系統是停留在更老的版本&#xff0c;應用軟件也是&#xff0c;因此很多的漏洞沒有被修復。通訊沒有使用加密&#xff0c;例如網頁沒有使用 HTTPS 網站很多。幾乎是半裸的在網絡上等著被食。 不做惡是下限。 環境&…

【Cadence射頻仿真學習筆記】2.4GHz低噪放LNA仿真設計

課程分為3個部分&#xff0c; 一、LNA結構與噪聲優化方法 噪聲優化的方法是&#xff1a;限定功耗的噪聲和功率同時匹配噪聲匹配和功率匹配一般不會同時達到&#xff0c; 對于PCSNIM結構的噪聲分析&#xff0c;我們只需要了解與哪些參數有關優化思路是&#xff1a;1.信號源阻抗…

【洛谷入門賽】B4042 順序結構 202410 場

題意 給你一個變量 a a a&#xff1a;小 Y 會讓 a a a 先加 5 5 5 再把它們的和乘 3 3 3 最后輸出&#xff1b;小 L 會讓 a a a 先乘 3 3 3 再加 5 5 5 最后輸出。 要求出小 Y 和小 L 分別會輸出什么東西。 思路 這道題按照題目意思模擬就可以了&#xff0c;重點是考…