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