網站首頁 編程語言 正文
1.準備
go get github.com/dgrijalva/jwt-go go get github.com/gin-gonic/gin
?2.代碼
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 = "服務器繁忙" ErrorReason_ReLogin = "請重新登陸" ) 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里面添加用戶信息,驗證token后可能會用到用戶信息 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 }
運行結果如圖:
訪問接口
登陸
驗證
刷新
http://localhost:9090/login/
http://localhost:9090/verify/
http://localhost:9090/refresh/
原文鏈接:https://zld126126.blog.csdn.net/article/details/91997398
相關推薦
- 2022-11-07 WPF使用DrawingContext實現繪制刻度條_C#教程
- 2022-07-02 pyscript的簡單應用實現_python
- 2022-07-29 Pytest框架?conftest.py文件的使用詳解_python
- 2022-09-12 輕量級域名解析服務器之dnsmasq的介紹與部署_服務器其它
- 2022-05-27 利用Python/R語言分別解決金字塔數求和問題_python
- 2023-05-21 詳解Python中文件路徑_python
- 2022-12-24 C#?Math中常用數學運算的示例詳解_C#教程
- 2022-11-18 C++11正則表達式詳解(regex_match、regex_search和regex_replac
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支