一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - golang中gin框架接入jwt使用token驗證身份

golang中gin框架接入jwt使用token驗證身份

2022-01-21 00:43劉海瓊寶寶 Golang

本文主要介紹了golang中gin框架接入jwt使用token驗證身份,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

jwt

jwt的原理和session有點相像,其目的是為了解決rest api中無狀態性

因為rest接口,需要權限校驗。但是又不能每個請求都把用戶名密碼傳入,因此產生了這個token的方法

流程:

用戶訪問auth接口,獲取token

服務器校驗用戶傳入的用戶名密碼等信息,確認無誤后,產生一個token。這個token其實是類似于map的數據結構(jwt數據結構)中的key。

準確的應該是:token中其實就保存了用戶的信息,只是被加密過了。怪不得服務器重啟了token還能使用,就是這個原因,因為數據就是保存在token這條長長的字符串中的。

用戶訪問需要權限驗證的接口,并傳入token。

服務器驗證token:根據自己的token密鑰判斷token是否正確(是否被別人篡改),正確后才從token中解析出token中的信息。可能會把解析出的信息保存在context中

這里使用開源的 jwt-go

1.token 工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package handler
 
import (
 "awesomeProject/utils"
 "github.com/dgrijalva/jwt-go"
 "github.com/gin-gonic/gin"
 "time"
)
//用戶信息類,作為生成token的參數
type UserClaims struct {
 ID    string `json:"userId"`
 Name  string `json:"name"`
 Phone string `json:"phone"`
 //jwt-go提供的標準claim
 jwt.StandardClaims
}
 
var (
 //自定義的token秘鑰
 secret = []byte("16849841325189456f487")
 //該路由下不校驗token
 noVerify = []interface{}{"/login", "/ping"}
 //token有效時間(納秒)
 effectTime = 2 * time.Hour
)
 
// 生成token
func GenerateToken(claims *UserClaims) string {
 //設置token有效期,也可不設置有效期,采用redis的方式
 //   1)將token存儲在redis中,設置過期時間,token如沒過期,則自動刷新redis過期時間,
 //   2)通過這種方式,可以很方便的為token續期,而且也可以實現長時間不登錄的話,強制登錄
 //本例只是簡單采用 設置token有效期的方式,只是提供了刷新token的方法,并沒有做續期處理的邏輯
 claims.ExpiresAt = time.Now().Add(effectTime).Unix()
 //生成token
 sign, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(secret)
 if err != nil {
  //這里因為項目接入了統一異常處理,所以使用panic并不會使程序終止,如不接入,可使用原始方式處理錯誤
  //接入統一異常可參考 https://blog.csdn.net/u014155085/article/details/106733391
  panic(err)
 }
 return sign
}
 
//驗證token
func JwtVerify(c *gin.Context) {
 //過濾是否驗證token
 if utils.IsContainArr(noVerify, c.Request.RequestURI) {
  return
 }
 token := c.GetHeader("token")
 if token == "" {
  panic("token not exist !")
 }
 //驗證token,并存儲在請求中
 c.Set("user", parseToken(token))
}
 
// 解析Token
func parseToken(tokenString string) *UserClaims {
 //解析token
 token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  return secret, nil
 })
 if err != nil {
  panic(err)
 }
 claims, ok := token.Claims.(*UserClaims)
 if !ok {
  panic("token is valid")
 }
 return claims
}
 
// 更新token
func Refresh(tokenString string) string {
 jwt.TimeFunc = func() time.Time {
  return time.Unix(0, 0)
 }
 token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  return secret, nil
 })
 if err != nil {
  panic(err)
 }
 claims, ok := token.Claims.(*UserClaims)
 if !ok {
  panic("token is valid")
 }
 jwt.TimeFunc = time.Now
 claims.StandardClaims.ExpiresAt = time.Now().Add(2 * time.Hour).Unix()
 return GenerateToken(claims)
}

2. 使用該中間件

?
1
2
3
4
5
6
7
8
9
10
11
func main() {
 router := gin.Default()
 router.Use(handler.JwtVerify)
 
 router.GET("/ping", controller.Ping)
 router.GET("/login", controller.Login)
 router.GET("/userInfo", controller.UserInfo)
 
 router.Run(":8888") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 
}

3. controller部分代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package controller
 
import (
 "awesomeProject/handler"
 "awesomeProject/utils"
 "github.com/dgrijalva/jwt-go"
 "github.com/gin-gonic/gin"
 "net/http"
)
 
func Ping(c *gin.Context) {
 c.JSON(http.StatusOK, utils.ResultT("this is ping"))
}
 
func Login(c *gin.Context) {
 c.JSON(http.StatusOK, utils.ResultT(gin.H{
  "token": handler.GenerateToken(&handler.UserClaims{
   ID:             "001",
   Name:           "張三",
   Phone:          "189***0023",
   StandardClaims: jwt.StandardClaims{},
  }),
 }))
 
}
 
func UserInfo(c *gin.Context) {
 user, _ := c.Get("user")
 claims := user.(*handler.UserClaims)
 c.JSON(http.StatusOK, utils.ResultT(claims.Phone))
}

到此這篇關于golang中gin框架接入jwt使用token驗證身份的文章就介紹到這了,更多相關gin jwt token驗證身份內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/u014155085/article/details/106735344

延伸 · 閱讀

精彩推薦
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
主站蜘蛛池模板: 俺去俺也在线www色官网 | 亚洲四虎| 视频免费视频观看网站 | 春光乍泄在线 | 亚飞与亚基高清国语在线观看 | 国产黑丝一区 | 国产真实伦对白在线播放 | 男人猛进女人屁股免费 | 欧美综合亚洲图片综合区 | 草逼吧 | japonensis日本护士 | 午夜神器老司机高清无码 | 亚洲精品一区二区三区在线播放 | 精品福利一区 | 秋葵视频成人 | 欧美视频一区二区三区在线观看 | 视频一区国产精戏刘婷 | 亚洲一级片在线播放 | 99久久免费精品视频 | 日韩不卡一区二区三区 | 国产精品视频一区二区三区 | 国产在线视频一区二区三区 | 午夜在线观看免费观看 视频 | 亚洲一二三区久久五月天婷婷 | 国产一区二区视频在线观看 | 情乱奶水欲 | avtt天堂在线 | 高h巨肉play 高h短篇辣肉各种姿势bl | 禁漫H天堂免费A漫 | 被老头肉至怀孕小说 | 欧美男女交配 | 免费视频片在线观看 | 三级伦理在线播放 | 手机看片一区二区 | 精品91 | 亚洲欧美日韩成人 | 高清一级做a爱免费视 | 美女mm131爽爽爽久久 | fuqer日本 | 亚洲国产在线综合018 | 特级夫妻大片免费在线播放 |