JWT(json web token)的授权方式
jwt是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;
1.客户端获取token
2.客户端使用token,客户端对token进行验证
JWT的构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(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))
//创建req验证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)
}