JWT程式碼實現
阿新 • • 發佈:2020-06-24
在Go中可以直接使用github.com/dgrijalva/jwt-go
簡單實現Token的生成和有效性檢驗。
如果存在私密的檔案,則需要使用使用密碼對稱加密。jwt
生成的token在沒有加密的情況下,需要使用https
傳輸資料,確保資料安全。
更多請參考:JSON Web Token 入門教程。
下面是程式碼實現:
package main
import (
"errors"
"fmt"
"log"
"time"
"github.com/dgrijalva/jwt-go"
)
type UserInfo struct {
ID uint64
Username string
}
const SecrectStr string ="hello world"
func CreateToken(user *UserInfo)(tokenss string,err error){
//自定義claim
claim := jwt.MapClaims{
"id": user.ID,"username": user.Username,"nbf": time.Now().Unix(),"iat": time.Now().Unix(),}
token := jwt.NewWithClaims(jwt.SigningMethodHS256,claim)
// 簽名後的token格式說明
// 示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NzUyODUyNzUsImlkIjoxLCJuYmYiOjE1NzUyODUyNzUsInVzZXJuYW1lIjoicGVuZ2oifQ.bDe8UZYLxvmrK7gHcuK8TrlnoiMsIm3Jo_f0-YYle7E
// 使用符號.,被分割成了三段
// 第一段base64解碼之後:{"alg":"HS256","typ":"JWT"}
// 第二段base64解碼之後:{"iat":1575285275,"id":1,"nbf":1575285275,"username":"pengj"},是原始的資料。
// 第三段是使用SigningMethodHS256加密之後的文字
tokenss,err = token.SignedString([]byte(SecrectStr))
return
}
func secret()jwt.Keyfunc{
return func(token *jwt.Token) (i interface{},e error) {
return []byte(SecrectStr),nil
return i,e
}
}
func ParseToken(tokenss string)(user *UserInfo,err error){
user = &UserInfo{}
token,err := jwt.Parse(tokenss,secret())
if err != nil{
return
}
claim,ok := token.Claims.(jwt.MapClaims)
if !ok{
err = errors.New("cannot convert claim to mapclaim")
return
}
//驗證token,如果token被修改過則為false
if !token.Valid{
err = errors.New("token is invalid")
return
}
user.ID =uint64(claim["id"].(float64))
user.Username = claim["username"].(string)
return
}
func main(){
user := UserInfo{ID:1,Username: "pengj"}
tokenStr,err := CreateToken(&user)
if err != nil {
panic(err)
}
log.Println("tokenStr:",tokenStr)
u,err := ParseToken(tokenStr)
if err != nil {
panic(err)
}
fmt.Println(u.ID,u.Username)
}
複製程式碼