go gin+token(JWT)驗證實現(xiàn)登陸驗證
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 = "服務(wù)器繁忙"
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
}
運行結(jié)果如圖:
訪問接口
登陸
驗證
刷新
http://localhost:9090/login/
http://localhost:9090/verify/
http://localhost:9090/refresh/

到此這篇關(guān)于go gin+token(JWT)驗證實現(xiàn)登陸驗證的文章就介紹到這了,更多相關(guān)go gin token JWT登陸驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Go語言構(gòu)建RESTful API服務(wù)
在實際開發(fā)項目中,你編寫的服務(wù)可以被其他服務(wù)使用,這樣就組成了微服務(wù)的架構(gòu);也可以被前端調(diào)用,這樣就可以前后端分離。那么,本文主要介紹什么是 RESTful API,以及 Go 語言是如何玩轉(zhuǎn) RESTful API 的2021-07-07
淺談golang for 循環(huán)中使用協(xié)程的問題
這篇文章主要介紹了淺談golang for 循環(huán)中使用協(xié)程的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Golang實現(xiàn)解析JSON的三種方法總結(jié)
這篇文章主要為大家詳細介紹了Golang實現(xiàn)解析JSON的三種方法,文中的示例代碼講解詳細,對我們學習了解JSON有一定幫助,需要的可以參考一下2022-09-09

