JWT(json web token)的授權(quán)方式
jwt是JSON風(fēng)格輕量級(jí)的授權(quán)和身份認(rèn)證規(guī)范,可實(shí)現(xiàn)無狀態(tài)、分布式的Web應(yīng)用授權(quán);
1.客戶端獲取token
2.客戶端使用token,客戶端對(duì)token進(jìn)行驗(yàn)證
JWT的構(gòu)成
第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品),第三部分是簽證(signature).
golang代碼:
使用jwt第三方包: https://github.com/dgrijalva/jwt-go
package main
import (
"github.com/dgrijalva/jwt-go"
"time"
"fmt"
"net/http"
"github.com/dgrijalva/jwt-go/request"
)
const (
k = "1885df74d00dbbe19274c6d955feeb5b"
)
func main() {
//生成token
//提供三種加密方式SigningMethodHS256(sha256)SigningMethodHS384,SigningMethodHS512
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.StandardClaims{
ExpiresAt: time.Now().AddDate(0, 0, 1).Unix(),
Id: "1",
})
fmt.Println(token)
t, _ := token.SignedString([]byte(k))
//創(chuàng)建req驗(yàn)證token
req, _ := http.NewRequest("GET", "test", nil)
req.Header.Add("token", t)
fmt.Println(req.Header)
token2, err := request.ParseFromRequest(req, request.HeaderExtractor{"token"}, func(token *jwt.Token) (interface{}, error) {
return []byte(k), nil
})
if err != nil {
fmt.Println(err.Error())
panic(err)
}
sc := token2.Claims.(jwt.MapClaims)
fmt.Println(sc)
}