Golang jwt跨域鉴权
JWT全称JSON Web Token是跨域认证解决方案,属于开放标准,规定了一种Token目前,实现模式主要用于前后端分离项目OAuth2.0
安装jwt
go get github.com/dgrijalva/jwt-go
生成jwt
package main import ( "errors" "fmt" jwt "github.com/dgrijalva/jwt-go" "time" ) type MyClaims struct { 除了脚下的Claims,还需要用户信息 Username string `json:"username"` Password string `json:"password"` //jwt中标准的Claims jwt.StandardClaims } var key = []byte("secret") //GenToken 生成token的方法 func GenToken(username string, password string) (string, error) { ///创建我们自己的声明 c := MyClaims{ username, //
自定义字段 password, jwt.StandardClaims{ ExpiresAt: time.Now().Add(time.Hour * 2).Unix(), //过期时间 Issuer: "Crisp", //签发人 }, } ////使用指定的签名方法创建签名对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) ///在这里使用HS256加密算法 //使用指定的secret签名并获得完整编码后的字符串token // 注意这个地方,字节切片不能是字符串 return token.SignedString(key) }
解析jwt
//ParseToken 解析token的方法
func ParseToken(tokenString string) (*MyClaims, error) {
//解析token
token, err := jwt.ParseWithClaims(tokenString, &MyClaims{
},
func(token *jwt.Token) (i interface{
}, err error) {
return key, nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
//校验token
return claims, nil
}
return nil, errors.New("invalid token")
}
调用生成token并解析token
func main() {
//生成token
token, err := GenToken("Crisp", "12345678")
if err != nil {
panic(err)
}
//解析token
parseToken, err := ParseToken(token)
if err != nil {
panic(err)
}
fmt.Printf("parseToken.UserName: %v\n", parseToken.Username)
fmt.Printf("parseToken.Password: %v\n", parseToken.Password)
}
代码运行结果
生成的token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkNyaXNwIiwicGFzc3dvcmQiOiIxMjM0NTY3OCIsImV4cCI6MTY1ODcyNzQxNXNzIjoiQ3Jpc3AifQ.wXUoWlv8VeMJo_ezWSlsEO_XOfcwh3aD4Y_q0YoZfDg
解析token:
解析token获得:parseToken.UserName: Crisp
解析token获得:parseToken.Password: 12345678