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

Go語言實(shí)現(xiàn)簡(jiǎn)單JWT登錄驗(yàn)證的示例代碼

 更新時(shí)間:2025年08月12日 08:22:44   作者:程序員愛釣魚  
在 Web 開發(fā)中,身份驗(yàn)證是一個(gè)繞不開的話題,JWT是一種無狀態(tài)的、跨平臺(tái)的身份驗(yàn)證解決方案,非常適合現(xiàn)代 Web API 場(chǎng)景,下面我們看看如何使用Go語言實(shí)現(xiàn)JWT 登錄驗(yàn)證吧

在 Web 開發(fā)中,身份驗(yàn)證是一個(gè)繞不開的話題。傳統(tǒng)的 Session 機(jī)制依賴服務(wù)器存儲(chǔ)用戶狀態(tài),而在微服務(wù)、分布式架構(gòu)下,這種方式可能會(huì)導(dǎo)致狀態(tài)同步困難。
JWT(JSON Web Token)是一種無狀態(tài)的、跨平臺(tái)的身份驗(yàn)證解決方案,非常適合現(xiàn)代 Web API 場(chǎng)景。

本文將帶你用 Go 實(shí)現(xiàn)一個(gè) JWT 登錄驗(yàn)證示例,掌握它的基本原理與使用方式。

一、什么是 JWT

JWT 的結(jié)構(gòu)由三部分組成:

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

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VyX2lkIjoxLCJleHAiOjE3MDAwMDAwMDB9
.abc123456789xyz

二、實(shí)現(xiàn)思路

1. 用戶登錄 → 校驗(yàn)賬號(hào)密碼正確 → 生成 JWT 返回給前端。

2. 前端請(qǐng)求 API → 在 Authorization 頭中攜帶 JWT。

3. 后端中間件 → 解析 JWT,驗(yàn)證有效性與過期時(shí)間。

4. 通過驗(yàn)證 → 執(zhí)行后續(xù)業(yè)務(wù)邏輯。

三、代碼實(shí)現(xiàn)

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

1. 初始化依賴

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

2. 定義 JWT 工具

package main

import (
    "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)
}

// 驗(yàn)證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. 構(gòu)建簡(jiǎn)單登錄和受保護(hù)接口

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strings"
)

// 模擬用戶數(shù)據(jù)
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, "用戶名或密碼錯(cuò)誤", 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格式錯(cuò)誤", http.StatusUnauthorized)
            return
        }

        claims, err := ParseToken(parts[1])
        if err != nil {
            http.Error(w, "無效Token", http.StatusUnauthorized)
            return
        }

        fmt.Printf("JWT解析結(jié)果: %+v\n", claims)
        next.ServeHTTP(w, r)
    }
}

func protectedHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "歡迎訪問受保護(hù)的資源!")
}

func main() {
    http.HandleFunc("/login", loginHandler)
    http.HandleFunc("/protected", authMiddleware(protectedHandler))

    fmt.Println("服務(wù)器啟動(dòng):http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

4. 測(cè)試流程

1. 登錄獲取 Token

curl -X POST "http://localhost:8080/login" -d "username=alice&password=123456"

返回:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI..."}

2. 訪問受保護(hù)接口

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI..." http://localhost:8080/protected

輸出:

歡迎訪問受保護(hù)的資源!

四、注意事項(xiàng)

1. Token 過期處理:前端需在過期后重新獲取 Token。

2. Secret 安全性:切勿將 jwtSecret 寫死在代碼里,可用環(huán)境變量管理。

3. HTTPS:避免 Token 在明文傳輸中被竊取。

4. 黑名單機(jī)制:如果需要即時(shí)讓某個(gè) Token 失效,可以維護(hù)一個(gè)黑名單。

五、總結(jié)

JWT 在 Go 中實(shí)現(xiàn)并不復(fù)雜,但它帶來的無狀態(tài)身份驗(yàn)證機(jī)制,非常適合 RESTful API 和分布式架構(gòu)場(chǎng)景。

通過本示例,你可以快速搭建一個(gè)基于 JWT 的登錄驗(yàn)證系統(tǒng),并根據(jù)業(yè)務(wù)需求進(jìn)行擴(kuò)展,比如刷新 Token角色權(quán)限控制等。

到此這篇關(guān)于Go語言實(shí)現(xiàn)簡(jiǎn)單JWT登錄驗(yàn)證的示例代碼的文章就介紹到這了,更多相關(guān)Go JWT登錄驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go html/template 模板的使用實(shí)例詳解

    Go html/template 模板的使用實(shí)例詳解

    這篇文章主要介紹了Go html/template 模板的使用實(shí)例詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Go語言中的Struct結(jié)構(gòu)體

    Go語言中的Struct結(jié)構(gòu)體

    這篇文章介紹了Go語言中的Struct結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang三個(gè)編譯基本命令的使用小結(jié)

    Golang三個(gè)編譯基本命令的使用小結(jié)

    本文主要介紹了Golang三個(gè)編譯基本命令的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語言學(xué)習(xí)函數(shù)+結(jié)構(gòu)體+方法+接口

    Go語言學(xué)習(xí)函數(shù)+結(jié)構(gòu)體+方法+接口

    這篇文章主要介紹了Go語言學(xué)習(xí)函數(shù)+結(jié)構(gòu)體+方法+接口,文章圍繞主題的相關(guān)資料展開詳細(xì)的文章說明,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Go日常開發(fā)常用第三方庫和工具介紹

    Go日常開發(fā)常用第三方庫和工具介紹

    這篇文章主要介紹了Go日常開發(fā)常用第三方庫和工具介紹,主要有web開發(fā)、數(shù)據(jù)庫開發(fā)、Redis開發(fā)需要的朋友可以參考下
    2022-11-11
  • C語言的10大基礎(chǔ)算法

    C語言的10大基礎(chǔ)算法

    算法是一個(gè)程序和軟件的靈魂,作為一名優(yōu)秀的程序員,只有對(duì)一些基礎(chǔ)的算法有著全面的掌握,才會(huì)在設(shè)計(jì)程序和編寫代碼的過程中顯得得心應(yīng)手。這篇文章主要介紹了C語言的10大基礎(chǔ)算法,需要的朋友可以參考下
    2019-09-09
  • Go語言繼承功能使用結(jié)構(gòu)體實(shí)現(xiàn)代碼重用

    Go語言繼承功能使用結(jié)構(gòu)體實(shí)現(xiàn)代碼重用

    今天我來給大家介紹一下在?Go?語言中如何實(shí)現(xiàn)類似于繼承的功能,讓我們的代碼更加簡(jiǎn)潔和可重用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    go?的接口在go的編程里面用的十分頻繁,尤其是空接口的使用,因?yàn)橛辛私涌?,才使得Go語言變得異常的強(qiáng)大,今天給大家介紹下Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享,感興趣的朋友一起看看吧
    2022-04-04
  • golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn)

    golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn)

    本文主要介紹了golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang如何利用原始套接字構(gòu)造UDP包詳解

    golang如何利用原始套接字構(gòu)造UDP包詳解

    這篇文章主要給大家介紹了關(guān)于golang如何利用原始套接字構(gòu)造UDP包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-10-10

最新評(píng)論

九寨沟县| 郯城县| 海丰县| 肇州县| 嫩江县| 伊宁县| 永宁县| 锡林郭勒盟| 本溪市| 柯坪县| 阿巴嘎旗| 新平| 洞口县| 长春市| 湘潭县| 宝兴县| 吉木萨尔县| 民权县| 靖西县| 金沙县| 土默特左旗| 德保县| 息烽县| 九寨沟县| 周至县| 眉山市| 南昌市| 宁陵县| 沙坪坝区| 托克托县| 明溪县| 平塘县| 临猗县| 博白县| 民丰县| 望奎县| 柘城县| 三穗县| 武安市| 鄂托克前旗| 贡嘎县|