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

go如何使用gin結(jié)合jwt做登錄功能簡單示例

 更新時間:2024年01月17日 08:28:57   作者:wjdsg  
jwt全稱Json web token,是一種認(rèn)證和信息交流的工具,這篇文章主要給大家介紹了關(guān)于go如何使用gin結(jié)合jwt做登錄功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1、安裝gin

go get -u github.com/gin-gonic/gin

2、安裝session

go get github.com/gin-contrib/sessions

3、安裝JWT鑒權(quán)

go get "github.com/golang-jwt/jwt/v4"

4、創(chuàng)建一個jwt的工具文件

package utils

import (
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"time"
)

type MyClaims struct {
	Phone                string `json:"phone"`
	jwt.RegisteredClaims        // 注意!這是jwt-go的v4版本新增的,原先是jwt.StandardClaims
}

var MySecret = []byte("wjdsg") // 定義secret,后面會用到

func Secret() jwt.Keyfunc {
	return func(token *jwt.Token) (interface{}, error) {
		return []byte(MySecret), nil // 這是我的secret
	}
}

// 這里傳入的是手機(jī)號,因?yàn)槲翼?xiàng)目登陸用的是手機(jī)號和密碼
func MakeToken(phone string) (tokenString string, err error) {
	claim := MyClaims{
		Phone: phone,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 過期時間3小時
			IssuedAt:  jwt.NewNumericDate(time.Now()),                                       // 簽發(fā)時間
			NotBefore: jwt.NewNumericDate(time.Now()),                                       // 生效時間
		}}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法
	tokenString, err = token.SignedString(MySecret)
	return tokenString, err
}

// 解析jwt
func ParseToken(tokenss string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret())
	if err != nil {
		if ve, ok := err.(*jwt.ValidationError); ok {
			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
				return nil, errors.New("非法令牌")
			} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
				return nil, errors.New("令牌國企")
			} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
				return nil, errors.New("令牌未激活")
			} else {
				return nil, errors.New("令牌未知錯誤")
			}
		}
	}
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, errors.New("couldn't handle this token")
}

5、開始使用

package main

import (
	"awesomeProject/utils"
	"fmt"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	// 初始化gin服務(wù)
	rootRouter := gin.Default()

	// 創(chuàng)建cookie存儲
	store := cookie.NewStore([]byte("secret"))
	//路由上加入session中間件
	rootRouter.Use(sessions.Sessions("mysession", store))

	//配置路由組
	group := rootRouter.Group("/wjdsg")
	{
		group.GET("/set", func(context *gin.Context) {
			session := sessions.Default(context)

			token, err := utils.MakeToken("15088888888")
			if err != nil {
				fmt.Println("jwt生產(chǎn)錯誤")
			}
			//將jwt保持到session中
			session.Set("adminId", token)
			session.Save()
			context.JSON(http.StatusOK, token)
		})
		group.GET("/get", func(context *gin.Context) {

			//獲取jwt
			session := sessions.Default(context)
			token := session.Get("adminId").(string)
			//解析jwt
			parseToken, err := utils.ParseToken(token)
			if err != nil {
				fmt.Println("jwt解析錯誤:", err)
			}

			m := make(map[string]interface{})

			m["jwt"] = token
			m["解析"] = parseToken

			context.JSON(http.StatusOK, m)
		})
	}

	//啟動http服務(wù),可以修改端口
	address := fmt.Sprintf(":%d", 8080)
	rootRouter.Run(address)
}

6、結(jié)果

總結(jié) 

到此這篇關(guān)于go如何使用gin結(jié)合jwt做登錄功能的文章就介紹到這了,更多相關(guān)go gin結(jié)合jwt做登錄功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言實(shí)現(xiàn)Viper配置管理筆記

    Go語言實(shí)現(xiàn)Viper配置管理筆記

    Viper 是一個功能強(qiáng)大、靈活易用的配置管理工具,本文主要介紹了Go語言實(shí)現(xiàn)Viper配置管理筆記,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • 利用 Go 語言編寫一個簡單的 WebSocket 推送服務(wù)

    利用 Go 語言編寫一個簡單的 WebSocket 推送服務(wù)

    這篇文章主要介紹了利用 Go 語言編寫一個簡單的 WebSocket 推送服務(wù),需要的朋友可以參考下
    2018-04-04
  • GO語言(golang)基礎(chǔ)知識

    GO語言(golang)基礎(chǔ)知識

    這篇文章主要介紹了GO語言(golang)基礎(chǔ)知識,需要的朋友可以參考下
    2015-01-01
  • Go strconv包實(shí)現(xiàn)字符串與數(shù)值轉(zhuǎn)換的深度解析

    Go strconv包實(shí)現(xiàn)字符串與數(shù)值轉(zhuǎn)換的深度解析

    在 Go 語言開發(fā)中,字符串與基本數(shù)據(jù)類型之間的轉(zhuǎn)換非常常見,Go 標(biāo)準(zhǔn)庫中的 strconv 包正是為這些場景設(shè)計(jì)的,下面小編就和大家詳細(xì)介紹一下它的具體應(yīng)用吧
    2026-03-03
  • Go并發(fā)同步核心庫syn包的使用深度指南

    Go并發(fā)同步核心庫syn包的使用深度指南

    在?Go?語言中,并發(fā)是最重要的特性之一,sync?是?Go?標(biāo)準(zhǔn)庫中用于?并發(fā)控制與同步?的核心工具,下面小編就和大家詳細(xì)介紹一下它的具體使用吧
    2026-03-03
  • vscode插件設(shè)置之Golang開發(fā)環(huán)境配置全過程

    vscode插件設(shè)置之Golang開發(fā)環(huán)境配置全過程

    go語言開發(fā)選擇vscode作為IDE工具也是一個不錯的選擇,下面這篇文章主要給大家介紹了關(guān)于vscode插件設(shè)置之Golang開發(fā)環(huán)境配置的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼

    Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼

    本文主要介紹了Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Go使用github.com/google/uuid生成唯一ID的操作方案

    Go使用github.com/google/uuid生成唯一ID的操作方案

    這篇文章介紹了Go語言中常用的UUID庫github.com/google/uuid,詳細(xì)講解了UUID的定義、特點(diǎn)、生成方法、轉(zhuǎn)換、解析、應(yīng)用場景以及性能情況,需要的朋友可以參考下
    2026-03-03
  • Go 語言中的 http.FileSystem詳細(xì)解析

    Go 語言中的 http.FileSystem詳細(xì)解析

    在本文中,我們深入探討了 Go 語言中的 http.FileSystem 接口,并介紹了它的基本原理、使用方法以及實(shí)際應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Go語言中rune方法使用詳解

    Go語言中rune方法使用詳解

    本文主要介紹了Go語言中rune方法使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論

图们市| 车致| 洞口县| 四子王旗| 香港| 永兴县| 攀枝花市| 丹凤县| 湖南省| 衡东县| 乌兰浩特市| 澎湖县| 黄平县| 阳城县| 仪征市| 蒲城县| 新巴尔虎左旗| 沙湾县| 赤峰市| 阿鲁科尔沁旗| 永年县| 锡林浩特市| 汕尾市| 阳曲县| 富顺县| 商城县| 桂平市| 绥德县| 大连市| 唐河县| 万全县| 华阴市| 黑河市| 和林格尔县| 彭州市| 汾阳市| 资溪县| 咸阳市| 太湖县| 韩城市| 高青县|