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

golang整合jwt的實現(xiàn)示例

 更新時間:2024年08月29日 10:15:18   作者:code:404-not-found  
json web tokens(jwt)已成為大多數(shù)web api設計中的常見身份驗證和授權方案之一,本文主要介紹了golang整合jwt的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

快速開始

下載包

go get github.com/dgrijalva/jwt-go

直接上代碼

package main

import (
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// 定義一個結構體 實現(xiàn)jwt.StandardClaims
type MyClaims struct {
	UserName string
	jwt.StandardClaims
}

const (
	SECRETKEY = "ghdrgdrgdrg34" //私鑰
)

func main() {
	// 生成token
	token, _ := GenerateToken()

	// 解析token
	c2, err := ParseToken(token)
	if err != nil {
		fmt.Println("token解析失敗", err.Error())
	}
	fmt.Println(c2.UserName)
}

// 生成token
func GenerateToken() (string, error) {
	maxAge := 60 * 60 * 24
	c := MyClaims{
		UserName: "用戶名",
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 過期時間
			NotBefore: time.Now().Unix(),                                          // 生效時間
			Issuer:    "本人",                                                       // 簽發(fā)人
		},
	}
	// method 加密方法 工作多用jwt.SigningMethodRS256
	// claims 實現(xiàn)Claims接口的結構體

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)

	// 用私鑰加密token
	tokenStr, err := token.SignedString([]byte(SECRETKEY))
	return tokenStr, err
}

// 解析token
func ParseToken(tokenString string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(SECRETKEY), nil
	})
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}

整合gin框架

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
)

// 定義一個結構體 實現(xiàn)jwt.StandardClaims
type MyClaims struct {
	UserName string
	jwt.StandardClaims
}

// 定義一個結構體 用來接收請求參數(shù)
type LoginData struct {
	User     string `form:"user" binding:"required"`
	Password string `form:"password" binding:"required"`
}

const (
	SECRETKEY = "ghdrgdrgdrg34" //私鑰
)

// 驗證token是否合法,合法則放行
func VerificationToken(c *gin.Context) {
	token := c.Request.Header.Get("token")
	log.Println(token)
	myClaims, err := ParseToken(token)
	if err != nil {
		c.JSON(401, gin.H{"status": err.Error()})
		c.Abort()
	} else {
		c.Set("username", myClaims.UserName)
		c.Next()
	}
}

func main() {
	r := gin.Default()

	// 登陸接口 用戶名密碼必須穿root 123456
	r.POST("/login", func(c *gin.Context) {
		var data LoginData
		// 在這種情況下,將自動選擇合適的綁定
		if c.ShouldBind(&data) == nil {
			fmt.Println(data.User, data.Password)
			if data.User == "root" && data.Password == "123456" {
				token, _ := GenerateToken(&data)
				c.JSON(200, gin.H{"token": token})
			} else {
				c.JSON(401, gin.H{"status": "unauthorized"})
			}
		}
	})

	// 測試token是否有效
	r.GET("/testToken", VerificationToken, func(c *gin.Context) {
		username, _ := c.Get("username")
		c.JSON(200, gin.H{"username": username})

	})

	r.Run(":8080")
}

// 生成token
func GenerateToken(loginData *LoginData) (string, error) {

	maxAge := 60 * 24
	c := MyClaims{
		UserName: loginData.User,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 過期時間
			NotBefore: time.Now().Unix(),                                          // 生效時間
			Issuer:    "本人",                                                       // 簽發(fā)人
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
	// 用私鑰加密token
	tokenStr, err := token.SignedString([]byte(SECRETKEY))
	return tokenStr, err
}

// 解析token
func ParseToken(tokenString string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(SECRETKEY), nil
	})
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}

到此這篇關于golang整合jwt的實現(xiàn)示例的文章就介紹到這了,更多相關golang整合jwt內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Go語言編程入門超級指南

    Go語言編程入門超級指南

    這篇文章主要介紹了Go語言編程的入門指南,包括對Go的變量及函數(shù)的基本介紹,需要的朋友可以參考下
    2016-01-01
  • golang int 轉float 強轉和高精度轉操作

    golang int 轉float 強轉和高精度轉操作

    這篇文章主要介紹了golang int 轉float 強轉和高精度轉操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go?集成nacos注冊中心、配置中心的過程詳解

    go?集成nacos注冊中心、配置中心的過程詳解

    這篇文章主要介紹了go集成nacos注冊中心、配置中心的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-12-12
  • Go項目配置管理神器之viper的介紹與使用詳解

    Go項目配置管理神器之viper的介紹與使用詳解

    viper是一個完整的?Go應用程序的配置解決方案,它被設計為在應用程序中工作,并能處理所有類型的配置需求和格式,下面這篇文章主要給大家介紹了關于Go項目配置管理神器之viper的介紹與使用,需要的朋友可以參考下
    2023-02-02
  • 使用Go語言進行安卓開發(fā)的詳細教程

    使用Go語言進行安卓開發(fā)的詳細教程

    本文將介紹如何使用Go語言進行安卓開發(fā),我們將探討使用Go語言進行安卓開發(fā)的優(yōu)點、準備工作、基本概念和示例代碼,通過本文的學習,你將了解如何使用Go語言構建高效的安卓應用程序,需要的朋友可以參考下
    2023-11-11
  • Golang字符串和數(shù)組的相互轉換

    Golang字符串和數(shù)組的相互轉換

    本文主要介紹了Golang字符串和數(shù)組的相互轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • Go語言ants協(xié)程池的具體使用

    Go語言ants協(xié)程池的具體使用

    ants是Go語言中一款高效的協(xié)程池庫,通過復用協(xié)程資源優(yōu)化高并發(fā)場景下的性能,本文就來介紹一下golang中大名鼎鼎的ants協(xié)程池庫的實現(xiàn)原理,感興趣的可以了解一下
    2025-08-08
  • go?defer延遲調(diào)用的使用場景示例詳解

    go?defer延遲調(diào)用的使用場景示例詳解

    這篇文章主要為大家介紹了go?defer延遲調(diào)用的使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 超實用的Golang通道指南之輕松實現(xiàn)并發(fā)編程

    超實用的Golang通道指南之輕松實現(xiàn)并發(fā)編程

    Golang?中的通道是一種高效、安全、靈活的并發(fā)機制,用于在并發(fā)環(huán)境下實現(xiàn)數(shù)據(jù)的同步和傳遞。本文主要介紹了如何利用通道輕松實現(xiàn)并發(fā)編程,需要的可以參考一下
    2023-04-04
  • Golang中四種gRPC模式舉例詳解

    Golang中四種gRPC模式舉例詳解

    gRPC是一種進程間通信技術,在微服務和云原生領域都有著廣泛的應用,下面這篇文章主要給大家介紹了關于Golang中四種gRPC模式的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03

最新評論

久治县| 卫辉市| 武邑县| 耒阳市| 华阴市| 利川市| 固原市| 界首市| 宜昌市| 衡东县| 佛坪县| 遵义市| 兴仁县| 谢通门县| 新和县| 五家渠市| 黔东| 辽宁省| 平陆县| 泾源县| 克拉玛依市| 喀喇沁旗| 镇江市| 卓尼县| 黄冈市| 尚志市| 西昌市| 宜宾市| 磐安县| 建水县| 茂名市| 东丽区| 东乡族自治县| 抚宁县| 沾化县| 成安县| 郓城县| 剑河县| 浪卡子县| 揭阳市| 庆阳市|