關(guān)于JWT
參考 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
package main
import (
"fmt"
"github.com/develop1024/jwt-go"
"time"
)
// 生成token
func GenerateToken(secret []byte, claims jwt.MapClaims) (tokenString string, err error) {
// 創(chuàng)建一個新的令牌對象粮宛,指定簽名方法和聲明
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// 使用密碼簽名并獲得完整的編碼令牌作為字符串
tokenString, err = token.SignedString(secret)
return
}
// 解析token
func ParseToken(tokenString string, secret []byte) (jwt.MapClaims, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return secret, nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
} else {
return nil, err
}
}
func main() {
// payload 存放實際需要傳遞的數(shù)據(jù)
data := jwt.MapClaims{
"iss": "wang",
"exp": time.Now().Add(time.Second * 1).Unix(),
"foo": "bar",
}
// 生成token
token, err := GenerateToken([]byte("abc"), data)
if err != nil {
panic(err)
}
fmt.Println("token: ", token)
// 解析token
claims, err := ParseToken(token, []byte("abc"))
if err != nil {
fmt.Println(err)
} else {
// 解析token拿到里面的數(shù)據(jù)
fmt.Println(claims["exp"])
fmt.Println(claims["foo"])
}
}
輸出
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTU4MzgzNzYsImZvbyI6ImJhciIsImlzcyI6IndhbmcifQ.O7hjWoQK3gL3aKbDSGGsmvtqnsowjphjiJ4_Gzl1L9c
1.595838376e+09
bar
主要
// 生成token
func GenerateToken(secret []byte, claims jwt.MapClaims) (tokenString string, err error) {
// 創(chuàng)建一個新的令牌對象忧饭,指定簽名方法和聲明
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// 使用密碼簽名并獲得完整的編碼令牌作為字符串
tokenString, err = token.SignedString(secret)
return
}
// 解析token
func ParseToken(tokenString string, secret []byte) (jwt.MapClaims, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return secret, nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
} else {
return nil, err
}
}
封裝后
package main
import (
"fmt"
"github.com/develop1024/gojwt"
"time"
)
func main() {
// 生成token
secret := []byte("hello secret")
token, err := gojwt.GenerateToken(secret, map[string]interface{}{
"iss": "wang",
"exp": time.Now().Add(time.Second * 1).Unix(),
"foo": "bar",
})
if err != nil {
panic(err)
}
fmt.Println("token: ", token)
// 解析token
claims, err := gojwt.ParseToken(token, secret)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(claims)
fmt.Println(claims["exp"])
fmt.Println(claims["iss"])
}
}