Go語言實戰案例:使用模板渲染HTML頁面

在 Web 開發中,身份驗證是一個繞不開的話題。傳統的 Session 機制依賴服務器存儲用戶狀態,而在微服務、分布式架構下,這種方式可能會導致狀態同步困難。
JWT(JSON Web Token)是一種無狀態的、跨平臺的身份驗證解決方案,非常適合現代 Web API 場景。

本文將帶你用 Go 實現一個?JWT 登錄驗證示例,掌握它的基本原理與使用方式。


一、什么是 JWT

JWT 的結構由三部分組成:

header.payload.signature
  • ??Header:聲明類型(JWT)和加密算法(如 HMAC SHA256)。
  • ??Payload:存放業務數據(如用戶ID、角色、過期時間)。
  • ??Signature:對前兩部分進行簽名,保證數據不可篡改。

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VyX2lkIjoxLCJleHAiOjE3MDAwMDAwMDB9
.abc123456789xyz

二、實現思路

  1. 1.?用戶登錄?→ 校驗賬號密碼正確 → 生成 JWT 返回給前端。
  2. 2.?前端請求 API?→ 在?Authorization?頭中攜帶 JWT。
  3. 3.?后端中間件?→ 解析 JWT,驗證有效性與過期時間。
  4. 4.?通過驗證?→ 執行后續業務邏輯。

三、代碼實現

我們使用?github.com/golang-jwt/jwt/v5?作為 JWT 庫。

1. 初始化依賴

go?get?github.com/golang-jwt/jwt/v5

2. 定義 JWT 工具

package?mainimport?("fmt""time""github.com/golang-jwt/jwt/v5"
)var?jwtSecret?=?[]byte("my_secret_key")//?生成Token
func?GenerateToken(username?string)?(string,?error)?{claims?:=?jwt.MapClaims{"username":?username,"exp":??????time.Now().Add(2?*?time.Hour).Unix(),"iat":??????time.Now().Unix(),}token?:=?jwt.NewWithClaims(jwt.SigningMethodHS256,?claims)return?token.SignedString(jwtSecret)
}//?驗證Token
func?ParseToken(tokenString?string)?(jwt.MapClaims,?error)?{token,?err?:=?jwt.Parse(tokenString,?func(token?*jwt.Token)?(interface{},?error)?{return?jwtSecret,?nil})if?claims,?ok?:=?token.Claims.(jwt.MapClaims);?ok?&&?token.Valid?{return?claims,?nil}return?nil,?err
}

3. 構建簡單登錄和受保護接口

package?mainimport?("encoding/json""fmt""net/http""strings"
)//?模擬用戶數據
var?users?=?map[string]string{"alice":?"123456","bob":???"654321",
}func?loginHandler(w?http.ResponseWriter,?r?*http.Request)?{username?:=?r.FormValue("username")password?:=?r.FormValue("password")if?pwd,?ok?:=?users[username];?!ok?||?pwd?!=?password?{http.Error(w,?"用戶名或密碼錯誤",?http.StatusUnauthorized)return}token,?_?:=?GenerateToken(username)w.Header().Set("Content-Type",?"application/json")json.NewEncoder(w).Encode(map[string]string{"token":?token})
}func?authMiddleware(next?http.HandlerFunc)?http.HandlerFunc?{return?func(w?http.ResponseWriter,?r?*http.Request)?{authHeader?:=?r.Header.Get("Authorization")if?authHeader?==?""?{http.Error(w,?"缺少Authorization頭",?http.StatusUnauthorized)return}parts?:=?strings.SplitN(authHeader,?"?",?2)if?len(parts)?!=?2?||?parts[0]?!=?"Bearer"?{http.Error(w,?"Authorization格式錯誤",?http.StatusUnauthorized)return}claims,?err?:=?ParseToken(parts[1])if?err?!=?nil?{http.Error(w,?"無效Token",?http.StatusUnauthorized)return}fmt.Printf("JWT解析結果:?%+v\n",?claims)next.ServeHTTP(w,?r)}
}func?protectedHandler(w?http.ResponseWriter,?r?*http.Request)?{fmt.Fprintln(w,?"歡迎訪問受保護的資源!")
}func?main()?{http.HandleFunc("/login",?loginHandler)http.HandleFunc("/protected",?authMiddleware(protectedHandler))fmt.Println("服務器啟動:http://localhost:8080")http.ListenAndServe(":8080",?nil)
}

4. 測試流程

  1. 1.?登錄獲取 Token
curl?-X?POST?"http://localhost:8080/login"?-d?"username=alice&password=123456"

返回:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI..."}
  1. 2.?訪問受保護接口
curl?-H?"Authorization:?Bearer?eyJhbGciOiJIUzI1NiIsInR5cCI..."?http://localhost:8080/protected

輸出:

歡迎訪問受保護的資源!

四、注意事項

  1. 1.?Token 過期處理:前端需在過期后重新獲取 Token。
  2. 2.?Secret 安全性:切勿將?jwtSecret?寫死在代碼里,可用環境變量管理。
  3. 3.?HTTPS:避免 Token 在明文傳輸中被竊取。
  4. 4.?黑名單機制:如果需要即時讓某個 Token 失效,可以維護一個黑名單。

五、總結

JWT 在 Go 中實現并不復雜,但它帶來的無狀態身份驗證機制,非常適合 RESTful API 和分布式架構場景。
通過本示例,你可以快速搭建一個基于 JWT 的登錄驗證系統,并根據業務需求進行擴展,比如刷新 Token角色權限控制等。


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

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

相關文章

@RequestMapping接收文件格式的形參(方法參數)

需求:將文件上傳到OSS,忽略域名與路徑,將文件名以 “img1.png,img2.png,img3.png”保存到數據庫中 1、先看結果 后端要接收postman傳遞的file文件2、SpringBoot接收參數方式 很顯然,上面postman上傳的地方可以傳入多個文件&#x…

【數據分享】2020-2022年我國鄉鎮的逐日最高氣溫數據(Shp/Excel格式)

之前我們分享過2020—2022年中國0.01分辨率逐日最高氣溫柵格數據(可以查看之前的文章獲悉詳情)!該數據是研究者張凌, 胡英屹等發布在國家冰川凍土沙漠科學數據中心平臺上的高分辨最高氣溫數據。很多小伙伴拿到數據后反饋柵格數據不太方便使用…

為什么C++主函數 main 要寫成 int 返回值 | main(int argc, char* argv[]) 這種寫法是什么意思?

主函數 main 要寫成 int 返回值?main(int argc, char* argv[]) 為什么里面沒有 cin 也能讀到數據,數據是怎么傳進去的?本文將一步步回答這些問題。1. 為什么 main 要寫成 intC 標準(ISO/IEC 14882)規定,mai…

【oracle閃回查詢】記錄字段短時間被修改的記錄

SELECT versions_starttime, versions_endtime, versions_operation, versions_xid, [字段1], [字段2] – 替換為實際字段名 FROM 表名 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL ‘15’ MINUTE AND SYSTIMESTAMP --15分鐘內 WHERE id ‘目標ID’ – 指定記錄的唯…

【軟考中級網絡工程師】知識點之 IP 組播技術:從原理到實戰

目錄一、IP 組播技術概述1.1 什么是 IP 組播1.2 IP 組播與其他傳輸方式對比二、IP 組播地址詳解2.1 IPv4 組播地址范圍及分類2.2 特殊 IPv4 組播地址示例2.3 IPv6 組播地址結構與特點2.4 IP 組播地址與 MAC 地址的映射關系三、IP 組播協議剖析3.1 IGMP 協議深度解析3.2 PIM 協議…

Akamai Bot Manager智能防護體系解析:邊緣計算與AI驅動的反爬蟲技術

{ “title”: “Akamai Bot Manager智能防護體系解析:邊緣計算與AI驅動的反爬蟲技術”, “tags”: “Akamai,Bot Manager,邊緣計算,反爬蟲,CDN安全,機器學習,威脅檢測,網絡安全”, “description”: “深度剖析Akamai Bot Manager的邊緣計算架構、機器學習檢測引擎、…

IIS Express中可以同時加載并使用.net4.0和.NET 2.0的 DLL

<add name"HttpHandler" path"UploadHttpHandler.ashx" verb"*" type"ABC.HttpHandler, ABC"/> </handlers> 如果IIS EXPRESS是加載4.0的環境&#xff0c;可以加載.NET 2.0的DLL嗎&#xff1f;在 IIS Express 中&#xff…

STM32 ESP8266 WiFi模塊驅動

STM32 ESP8266 WiFi模塊驅動 1. 簡介 ESP8266是一款高度集成的WiFi芯片&#xff0c;可以為其他設備提供WiFi聯網功能。本筆記記錄了基于STM32 HAL庫的ESP8266驅動實現&#xff0c;包括硬件連接、初始化配置、AT指令交互等關鍵部分。 項目源碼倉庫&#xff1a;STM32_Sensor_D…

7 種最佳 DBAN 替代方案,徹底擦除硬盤數據

DBAN&#xff08;Darik 的 Boot and Nuke&#xff09;長期以來一直是安全擦除計算機數據的首選解決方案。然而&#xff0c;盡管 DBAN 廣受歡迎&#xff0c;但它也存在一些明顯的局限性&#xff0c;這些局限性隨著時間的推移變得越來越明顯。現在&#xff0c;本文將更詳細地探討…

【K8s】K8s控制器——Deamonset、Statefulset、Job與CronJob

1、Deamonset2、Statefulset3、Job與CronJob一次性作業與周期性作業#- 8.6 #cat > daemonset.yml <<EOF apiVersion: apps/v1 kind: DaemonSet metadata:name: test-demonsetlabels:daemonset: test spec:selector:matchLabels:name: testpodtemplate:metadata:labels…

基于柔性管控終端的新能源汽車充電站有序充電系統設計與實現

摘要&#xff1a;隨著新能源汽車的迅猛發展&#xff0c;充電基礎設施面臨著電力負荷激增、電網穩定性下降等挑戰。本文針對當前充電設施無序充電導致的電網壓力問題&#xff0c;提出了一種基于柔性管控終端的充電站有序充電系統解決方案。通過分析國內外有序充電技術發展現狀&a…

10-docker基于dockerfile自動制作鏡像

文章目錄一.為什么要學習自動構建鏡像1.為什么要學習自動化構建鏡像2.根據dockerfile自動構建鏡像的流程3.常用的dockerfile指令二.使用dockerfile構建nginx服務鏡像&#xff08;FR0M&#xff0c;RUN&#xff0c;CMD&#xff09;1.創建dockerfile的存儲路徑2.編寫dockerfile文件…

如何解決大模型API明明一分鐘內只發起了一次請求,卻觸發了 “Your account reached max request” 的錯誤

問題背景 在使用 OpenAI SDK 進行 API 調用時&#xff0c;你可能會遇到這樣的困惑&#xff1a;明明一分鐘內只發起了一次請求&#xff0c;卻觸發了 “Your account reached max request” 的錯誤。仔細排查之后發現&#xff0c;并不是 SDK 真正向服務端發送了超限的多次請求&a…

使用Spring Boot+Vue3開源的即時通訊 IM 系統

1. 產品概述V-IM 是一款基于 Electron 和 Vue 3 開發的跨平臺即時通訊客戶端&#xff0c;目前正在進行2025年版本的開發。該應用提供了豐富的即時通訊功能&#xff0c;支持個人聊天、群組聊天、文件傳輸等功能&#xff0c;適用于企業內部通訊或團隊協作場景。2. 核心功能2.1 用…

在Mac上搭建本地AI工作流:Dify與DeepSeek的完美結合

在Mac上搭建本地AI工作流&#xff1a;Dify與DeepSeek的完美結合 一、Dify平臺簡介 Dify是一個開源的大語言模型(LLM)應用開發平臺&#xff0c;旨在簡化和加速生成式AI應用的創建和部署。其名字蘊含著"Define&#xff08;定義&#xff09; Modify&#xff08;修改&#x…

centos出現ping: baidu.com: 未知的名稱或服務問題

出現的問題如下&#xff1a;自己電腦連接的是實驗室的無線網&#xff0c;宿主機可以上網&#xff0c;但是虛擬機無法ping通百度 解決&#xff1a; 將連接的網絡換成自己的手機熱點&#xff0c;然后就解決了。。。

GitHub第三方登錄全解析:OAuth 2.0流程詳解(適合初學者)

&#x1f510; GitHub第三方登錄全解析&#xff1a;OAuth 2.0流程詳解&#xff08;適合初學者&#xff09; &#x1f31f; 什么是OAuth&#xff1f;為什么需要它&#xff1f; 想象一下&#xff1a;你開發了一個學習筆記應用"DocFlow"&#xff0c;用戶需要登錄才能使用…

MyBatis持久層實現

MyBatis持久層實現 package com.example.usermanagement.mapper;import com.example.usermanagement.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List;/*** 用戶Mapper接口* Mapper: 標識這是M…

BW處理鏈日志存儲分析與清理

處理鏈日志存儲分析使用程序 RSPC_LOGS_ANALYZE 分析處理鏈日志占用空間*&---------------------------------------------------------------------* *& Report RSPC_LOGS_ANALYZE *&---------------------------------------------------------------------* *&a…

mysql 簡單操作手冊

以下是一份 MySQL 日常操作速查手冊&#xff0c;包含啟動/停止服務、連接/退出客戶端、數據庫管理、用戶權限等常用命令&#xff0c;適用于 macOS&#xff08;Homebrew 安裝&#xff09;和 Linux 系統&#xff1a;一、服務管理 &#x1f6a6;操作命令&#xff08;Homebrew&…