JWT 在 golang 中的使用

JWT (JSON Web Tokens)

JWT 可以说是一种无状态的身份认证机制;服务器不会维护身份验证的状态,作用与session,cookie 类似。

JWT 的结构

header(头部),payload(载荷),signature(签名) ,
并且三者是通过 “.” 拼接的。例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE1NTQwMDA0NDQsImlzcyI6IiJ9.m2EwMPwo3Jg9mdJaDC_5LETYsofmsX6-mKqQXISZbRs
header

包含 alg ,typ 两个属性

  • alg 表示签名的加密算法
  • yp 表示token类型,此处用 JWT 类型。
    例如
{
  "alg": "HS256",
  "typ": "JWT"
}
payload

payload 用来存放需要传递的信息。其中,除了JWT 规范定义的七个标准字段外,还可以包含自定义的数据。
官方给出的:

  • iss : 发行者
  • sub : 主题
  • exp : 到期时间
  • aud : 接收者
  • nbf : 生效时间
  • iat : 签发时间
  • jti : jwt 的编号(每个令牌的唯一标识符)
signature

signature 是用于令牌验证的签名(可以说是对header,payload 再加上一个secret 的签名)。其由三部分组成 , 如下:

HMAC-SHA256 (
  base64urlEncoding(header) + "." 
  base64urlEncoding(payload),
  secret
)

JWT 在 golang 中的使用

package jwt 的相关文档

https://godoc.org/github.com/dgrijalva/jwt-go#example-New–Hmac

JWT 包的下载
go get github.com/dgrijalva/jwt-go
创建 Token
type jwtCustomClaims struct {
    jwt.StandardClaims
}
func CreateToken( issuer string) (tokenString string, err error) {
    SecretKey := []byte("123456") // 设置密钥
    claims := &jwtCustomClaims{   // claims(即 payload) :存储需要传递的重要信息
        jwt.StandardClaims{
            ExpiresAt: int64(time.Now().Add(time.Second * 50).Unix()), // 设置过期时间为 50 秒
            Issuer:    issuer,                    // 设置令牌发行者,指明 Token 的用户
        },

    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 创建 Token 对象,第一个参数是签名的算法
    tokenString, err = token.SignedString(SecretKey)
    return
}
解析 Token
func ParseToken(tokenStr string) (iss string, err error) {

    SecretKey := []byte("123456")
    var token *jwt.Token
    token, err = jwt.Parse(tokenStr, func(*jwt.Token) (interface{}, error) {
        return SecretKey, nil
    })

    claims, _ := token.Claims.(jwt.MapClaims)
    fmt.Println(claims)
        if token.Valid { // 检查令牌是否有效
            return claims["iss"].(string), nil

        } else {
            return claims["iss"].(string), errors.New("token无效")

        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值