jwt是什麼,能夠百度下其它文章,我原來看到一個講的詳細的,如今找不到了。先簡單介紹下我我的的理解,就是一個token,只不過經過加密解密的手段,能讓這一串字符帶有一些簡單的信息。這樣解密jwt後不用查數據庫,最經常使用的例子,保存用戶權限,再多層的權限,其實只用一個數字,轉換成二進制,每一位表明一種權限。相似這樣的使用,還有保存session的key,經過該值查session就能獲取更豐富的資料,用來保存用戶狀態也是能夠的。git
下面介紹下個人一個golang項目中使用beego框架作純API接口使用jwt的方法。github
首先用到jwt函數的go文件都要引入這個庫golang
import (
"github.com/dgrijalva/jwt-go"
)數據庫
if passwd == user.Password { // 帶權限建立令牌 claims := make(jwt.MapClaims) claims["username"] = username if username == "admin" { claims["admin"] = "true" } else { claims["admin"] = "false" } claims["exp"] = time.Now().Add(time.Hour * 480).Unix() //20天有效期,過時須要從新登陸獲取token token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 使用自定義字符串加密 and get the complete encoded token as a string tokenString, err := token.SignedString([]byte("mykey")) if err != nil { beego.Error("jwt.SignedString:", err) this.RetError(errSystem) return } this.Data["json"] = map[string]interface{}{"status": 200, "message": "login success ", "moreinfo": tokenString} } else { this.Data["json"] = map[string]interface{}{"status": 400, "message": "login failed ", "moreinfo": time.Now().Format("2006-01-02 15:04:05")} }
// ParseToken parse JWT token in http header. func (c *BaseController) ParseToken() (t *jwt.Token, e *ControllerError) { authString := c.Ctx.Input.Header("Authorization") beego.Debug("AuthString:", authString) kv := strings.Split(authString, " ") if len(kv) != 2 || kv[0] != "Bearer" { beego.Error("AuthString invalid:", authString) return nil, errInputData } tokenString := kv[1] // Parse token token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return []byte("mykey"), nil }) if err != nil { beego.Error("Parse token:", err) if ve, ok := err.(*jwt.ValidationError); ok { if ve.Errors&jwt.ValidationErrorMalformed != 0 { // That's not even a token return nil, errInputData } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 { // Token is either expired or not active yet return nil, errExpired } else { // Couldn't handle this token return nil, errInputData } } else { // Couldn't handle this token return nil, errInputData } } if !token.Valid { beego.Error("Token invalid:", tokenString) return nil, errInputData } beego.Debug("Token:", token) return token, nil }
其餘API代碼片斷
token, e := this.ParseToken() if e != nil { this.RetError(e) return } claims, ok := token.Claims.(jwt.MapClaims) if !ok { this.RetError(errPermission) return } var user string = claims["username"].(string)