在Go中實(shí)現(xiàn)JWT(JSON Web Token)本地驗(yàn)證,可以按照以下步驟進(jìn)行:
go get github.com/dgrijalva/jwt-go
import (
"github.com/dgrijalva/jwt-go"
)
type Claims struct {
Username string `json:"username"`
jwt.StandardClaims
}
這里使用了jwt.StandardClaims
來(lái)包含JWT的標(biāo)準(zhǔn)字段(如過(guò)期時(shí)間等)。
secretKey
:var secretKey = []byte("your-secret-key")
func GenerateJWT(username string) (string, error) {
claims := &Claims{
Username: username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 設(shè)置過(guò)期時(shí)間為24小時(shí)
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString(secretKey)
if err != nil {
return "", err
}
return signedToken, nil
}
在這個(gè)示例中,我們使用jwt.NewWithClaims
創(chuàng)建了一個(gè)JWT,并使用SigningMethodHS256
指定了簽名算法。然后,我們使用token.SignedString
方法對(duì)JWT進(jìn)行簽名,并返回簽名后的JWT字符串。
func ValidateJWT(tokenString string) (*Claims, error) {
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil {
return nil, err
}
if !token.Valid {
return nil, errors.New("invalid token")
}
return claims, nil
}
在這個(gè)示例中,我們使用jwt.ParseWithClaims
方法解析JWT,并將解析后的Claims存儲(chǔ)在claims
變量中。然后,我們使用相同的密鑰驗(yàn)證JWT的簽名是否有效。如果驗(yàn)證通過(guò),我們返回解析后的Claims。否則,返回一個(gè)錯(cuò)誤。
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
type Claims struct {
Username string `json:"username"`
jwt.StandardClaims
}
var secretKey = []byte("your-secret-key")
func main() {
username := "john.doe"
token, err := GenerateJWT(username)
if err != nil {
fmt.Println("Error generating JWT:", err)
return
}
fmt.Println("JWT:", token)
claims, err := ValidateJWT(token)
if err != nil {
fmt.Println("Error validating JWT:", err)
return
}
fmt.Println("Valid token for user:", claims.Username)
}
func GenerateJWT(username string) (string, error) {
claims := &Claims{
Username: username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString(secretKey)
if err != nil {
return "", err
}
return signedToken, nil
}
func ValidateJWT(tokenString string) (*Claims, error) {
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil {
return nil, err
}
if !token.Valid {
return nil, errors.New("invalid token")
}
return claims, nil
}
在這個(gè)示例中,我們