網站首頁 編程語言 正文
一 引入jwt
jwt用戶身份驗證
go get github.com/dgrijalva/jwt-go
二 框架中引入jwt
import ( "fmt" "github.com/astaxie/beego" "github.com/dgrijalva/jwt-go" "time" )
三 使用
聲明jwt需要用到的結構體
const ( KEY string = "JWT-ARY-STARK" DEFAULT_EXPIRE_SECONDS int = 600 //默認過期時間(s) ) type User struct { Id string `json:"id"` Name string `json:"json"` } // JWT -- json web token // HEADER PAYLOAD SIGNATURE // This struct is the PAYLOAD type MyCustomClaims struct { User jwt.StandardClaims }
結果?
1234567891011121314151617
封裝方法
//刷新jwt token func RefreshToken(tokenString string) (string, error) { // first get previous token token, err := jwt.ParseWithClaims( tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(KEY), nil }) claims, ok := token.Claims.(*MyCustomClaims) if !ok || !token.Valid { return "", err } mySigningKey := []byte(KEY) expireAt := time.Now().Add(time.Second * time.Duration(DEFAULT_EXPIRE_SECONDS)).Unix() newClaims := MyCustomClaims{ claims.User, jwt.StandardClaims{ ExpiresAt: expireAt, Issuer: claims.User.Name, IssuedAt: time.Now().Unix(), }, } // generate new token with new claims newToken := jwt.NewWithClaims(jwt.SigningMethodHS256, newClaims) tokenStr, err := newToken.SignedString(mySigningKey) if err != nil { fmt.Println("generate new fresh json web token failed !! error :", err) return "", err } return tokenStr, err } //驗證jtw token func ValidateToken(tokenString string) (info User, err error) { token, err := jwt.ParseWithClaims( tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(KEY), nil }) if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid { //fmt.Printf("%v %v", claims.User, claims.StandardClaims.ExpiresAt) //fmt.Println("token will be expired at ", time.Unix(claims.StandardClaims.ExpiresAt, 0)) info = claims.User } else { fmt.Println("validate tokenString failed !!!", err) } return } //獲取jwt token func GenerateToken(info *User, expiredSeconds int) (tokenString string, err error) { if expiredSeconds == 0 { expiredSeconds = DEFAULT_EXPIRE_SECONDS } // Create the Claims mySigningKey := []byte(KEY) expireAt := time.Now().Add(time.Second * time.Duration(expiredSeconds)).Unix() fmt.Println("token will be expired at ", time.Unix(expireAt, 0)) // pass parameter to this func or not user := *info claims := MyCustomClaims{ user, jwt.StandardClaims{ ExpiresAt: expireAt, Issuer: user.Name, IssuedAt: time.Now().Unix(), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenStr, err := token.SignedString(mySigningKey) if err != nil { fmt.Println("generate json web token failed !! error :", err) } else { tokenString = tokenStr } return } // return this result to client then all later request should have header "Authorization: Bearer <token> " func getHeaderTokenValue(tokenString string) string { //Authorization: Bearer <token> return fmt.Sprintf("Bearer %s", tokenString) }
結果?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
使用
//獲取token func (this *UserController) Get() { user := User{1, "gangan"} token, err := GenerateToken(&user, 0); if err != nil { fmt.Println(err) }else { //獲取jwt this.Ctx.WriteString(token) } } //驗證token func (this *UserController) Check() { token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwianNvbiI6ImdhbmdhbiIsImV4cCI6MTU3ODU1NDMyOCwiaWF0IjoxNTc4NTUzNzI4LCJpc3MiOiJnYW5nYW4ifQ.jOlMlfLMFBJvyrJTLagrwQx2931LzM7Z0EVMFZ75xYI" info, err := ValidateToken(token) if err != nil { this.Ctx.WriteString(err.Error()) this.StopRun() } fmt.Println(info) this.Ctx.WriteString("success") }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/14085032.html
相關推薦
- 2022-08-28 IntelliJ IDEA 下debugger熱加載(Hot Swap)有時候失效解決
- 2022-09-24 VisualStudio?制作Dynamic?Link?Library動態鏈接庫文件的詳細過程_C
- 2022-09-19 Redis實現事物以及鎖的方法_Redis
- 2022-11-08 H5頁面 禁止微信分享轉發按鈕
- 2023-06-18 C#使用udp如何實現消息的接收和發送_C#教程
- 2023-04-12 你真的理解C語言qsort函數嗎?帶你深度剖析qsort函數_C 語言
- 2021-12-13 VS在調試時,查看是DEBUG/RELEASE
- 2022-05-10 gin實現限流中間件
- 最近更新
-
- 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同步修改后的遠程分支