激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Golang - go gin+token(JWT)驗(yàn)證實(shí)現(xiàn)登陸驗(yàn)證

go gin+token(JWT)驗(yàn)證實(shí)現(xiàn)登陸驗(yàn)證

2022-01-21 00:40學(xué)生董格 Golang

本文主要介紹了go gin+token(JWT)驗(yàn)證實(shí)現(xiàn)登陸驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1.準(zhǔn)備

?
1
2
go get github.com/dgrijalva/jwt-go
go get github.com/gin-gonic/gin

 2.代碼

?
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
 
import (
    "errors"
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "github.com/gin-gonic/gin"
    "net/http"
    "time"
)
 
func main() {
    r := gin.Default()
    r.GET("/login/:username/:password", login)
    r.GET("/verify/:token", verify)
    r.GET("/refresh/:token", refresh)
    r.GET("/sayHello/:token", sayHello)
    r.Run(":9090")
 
    //http://localhost:9090/login/dong/123456
    //http://localhost:9090/verify/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIyMTAsImlhdCI6MTU2MDUwODYxMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltdfQ.Esh1Zge0vO1BAW1GeR5wurWP3H1jUIaMf3tcSaUwkzA
    //http://localhost:9090/refresh/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIyNDMsImlhdCI6MTU2MDUwODYxMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltdfQ.Xkb_J8MWXkwGUcBF9bpp2Ccxp8nFPtRzFzOBeboHmg0
}
 
const(
    ErrorReason_ServerBusy = "服務(wù)器繁忙"
    ErrorReason_ReLogin = "請(qǐng)重新登陸"
)
 
func sayHello(c *gin.Context) {
    strToken := c.Param("token")
    claim,err := verifyAction(strToken)
    if err != nil {
        c.String(http.StatusNotFound, err.Error())
        return
    }
    c.String(http.StatusOK, "hello,",claim.Username)
}
 
type JWTClaims struct { // token里面添加用戶信息,驗(yàn)證token后可能會(huì)用到用戶信息
    jwt.StandardClaims
    UserID      int      `json:"user_id"`
    Password    string   `json:"password"`
    Username    string   `json:"username"`
    FullName    string   `json:"full_name"`
    Permissions []string `json:"permissions"`
}
 
var (
    Secret     = "dong_tech" // 加鹽
    ExpireTime = 3600        // token有效期
)
 
func login(c *gin.Context) {
    username := c.Param("username")
    password := c.Param("password")
    claims := &JWTClaims{
        UserID:      1,
        Username:    username,
        Password:    password,
        FullName:    username,
        Permissions: []string{},
    }
    claims.IssuedAt = time.Now().Unix()
    claims.ExpiresAt = time.Now().Add(time.Second * time.Duration(ExpireTime)).Unix()
    signedToken,err:=getToken(claims)
    if err!=nil{
        c.String(http.StatusNotFound, err.Error())
        return
    }
    c.String(http.StatusOK, signedToken)
}
 
func verify(c *gin.Context) {
    strToken := c.Param("token")
    claim,err := verifyAction(strToken)
    if err != nil {
        c.String(http.StatusNotFound, err.Error())
        return
    }
    c.String(http.StatusOK, "verify,",claim.Username)
}
 
func refresh(c *gin.Context) {
    strToken := c.Param("token")
    claims,err := verifyAction(strToken)
    if err != nil {
        c.String(http.StatusNotFound, err.Error())
        return
    }
    claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt)
    signedToken,err:=getToken(claims)
    if err!=nil{
        c.String(http.StatusNotFound, err.Error())
        return
    }
    c.String(http.StatusOK, signedToken)
}
 
func verifyAction(strToken string) (*JWTClaims, error) {
    token, err := jwt.ParseWithClaims(strToken, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte(Secret), nil
    })
    if err != nil {
        return nil, errors.New(ErrorReason_ServerBusy)
    }
    claims, ok := token.Claims.(*JWTClaims)
    if !ok {
        return nil, errors.New(ErrorReason_ReLogin)
    }
    if err := token.Claims.Valid(); err != nil {
        return nil, errors.New(ErrorReason_ReLogin)
    }
    fmt.Println("verify")
    return claims, nil
}
 
func getToken(claims *JWTClaims)(string,error){
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString([]byte(Secret))
    if err != nil {
        return "",errors.New(ErrorReason_ServerBusy)
    }
    return signedToken,nil
}

運(yùn)行結(jié)果如圖:

訪問接口

登陸
驗(yàn)證
刷新
http://localhost:9090/login/
http://localhost:9090/verify/
http://localhost:9090/refresh/

go gin+token(JWT)驗(yàn)證實(shí)現(xiàn)登陸驗(yàn)證

到此這篇關(guān)于go gin+token(JWT)驗(yàn)證實(shí)現(xiàn)登陸驗(yàn)證的文章就介紹到這了,更多相關(guān)go gin token JWT登陸驗(yàn)證內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://zld126126.blog.csdn.net/article/details/91997398

延伸 · 閱讀

精彩推薦
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

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

    Go語言中文網(wǎng)11352020-05-21
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

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

    4272021-11-24
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

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

    腳本之家3642020-04-25
  • Golanggolang 通過ssh代理連接mysql的操作

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

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

    a165861639710342021-03-08
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

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

    天易獨(dú)尊11682021-06-09
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

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

    李浩的life12792020-05-27
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

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

    SmallQinYan12302021-02-02
主站蜘蛛池模板: 综合在线一区 | 国产一区二区三区在线免费观看 | 一区二区三区日韩精品 | 99在线热播精品免费 | 日本羞羞的午夜电视剧 | 亚洲免费视频一区二区 | 99久久婷婷国产综合精品青牛牛 | 性欧美视频在线观看 | 艹逼视频污 | 欧美性猛交xxx乱大交3蜜桃 | www.com超碰| 国产亚洲精品久久久久久大师 | 久久日韩 | 精品欧美一区二区精品久久小说 | 国产精品视频在 | 国产精品99久久久久久久女警 | 久久成人激情视频 | 九九热免费视频在线观看 | 性视频久久 | 欧美久久久久久久久 | 久久免费视频一区 | 少妇一级淫片免费放正片 | 国产精品一区视频 | 欧美ab| 欧美精品18 | 亚洲片在线观看 | 欧美91看片特黄aaaa | 欧美五月婷婷 | av免费在线观看av | 国产精品一区久久久久 | 草久在线| 91精品视频网址 | 欧美一级网站 | 亚洲第五色综合网 | 欧美一级淫片免费播放口 | 激情在线视频 | 日本a级免费 | 在线观看一区二区三区四区 | 毛片免费视频网站 | 久草在线资源观看 | 国产精品视频一区二区三区四 |