欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

快速開始

下載包

go get github.com/dgrijalva/jwt-go

直接上代碼

package main

import (
	"fmt"
	"time"

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

// 定義一個(gè)結(jié)構(gòu)體 實(shí)現(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(), // 過期時(shí)間
			NotBefore: time.Now().Unix(),                                          // 生效時(shí)間
			Issuer:    "本人",                                                       // 簽發(fā)人
		},
	}
	// method 加密方法 工作多用jwt.SigningMethodRS256
	// claims 實(shí)現(xiàn)Claims接口的結(jié)構(gòu)體

	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"
)

// 定義一個(gè)結(jié)構(gòu)體 實(shí)現(xiàn)jwt.StandardClaims
type MyClaims struct {
	UserName string
	jwt.StandardClaims
}

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

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

// 驗(yàn)證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
		// 在這種情況下,將自動(dòng)選擇合適的綁定
		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(), // 過期時(shí)間
			NotBefore: time.Now().Unix(),                                          // 生效時(shí)間
			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
	}
}

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

相關(guān)文章

  • go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法

    go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法

    這篇文章主要介紹了go項(xiàng)目實(shí)現(xiàn)mysql接入以及web api,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 使用GO語言實(shí)現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例

    使用GO語言實(shí)現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例

    本文主要介紹了使用GO語言實(shí)現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Go 語言中的死鎖問題解決

    Go 語言中的死鎖問題解決

    本文主要介紹了Go 語言中的死鎖問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • GoZero實(shí)現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡單示例

    GoZero實(shí)現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡單示例

    在 GoZero 框架中實(shí)現(xiàn)數(shù)據(jù)庫的單例連接可以通過以下步驟來完成,GoZero 使用 gorm 作為默認(rèn)的數(shù)據(jù)庫操作框架,接下來我會(huì)展示一個(gè)簡單的單例模式實(shí)現(xiàn),需要的朋友可以參考下
    2025-02-02
  • Golang中反射的常見用法分享

    Golang中反射的常見用法分享

    本篇文章主要為大家詳細(xì)介紹一些Go語言中常見的反射用法,涵蓋了常見的數(shù)據(jù)類型的反射操作。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-01-01
  • Golang time.Sleep()用法及示例講解

    Golang time.Sleep()用法及示例講解

    Go語言中的Sleep()函數(shù)用于在至少規(guī)定的持續(xù)時(shí)間d內(nèi)停止最新的go-routine,這篇文章主要介紹了Golang time.Sleep()用法及示例講解,需要的朋友可以參考下
    2023-02-02
  • go語法入門匿名函數(shù)定義及使用示例詳解

    go語法入門匿名函數(shù)定義及使用示例詳解

    這篇文章主要為大家介紹了go語法入門匿名函數(shù)定義及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例

    Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例

    這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • golang通過http訪問外部網(wǎng)址的操作方法

    golang通過http訪問外部網(wǎng)址的操作方法

    這篇文章主要介紹了golang通過http訪問外部網(wǎng)址的操作方法,分為?get方式訪問外部的接口,Post方式請求外部接口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論