golang jwt token生成示例

package main

import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"time"
)

// jwt原始头部信息
type JwtHeaderRaw struct {
Alg string `json:"alg"` // 签名算法
Typ string `json:"typ"` // 类型
}

// jwt原始载荷信息
type JwtPayloadRaw struct {
Iss   string   `json:"iss"`   // 签发者
Sub   string   `json:"sub"`   // 面向的用户
Aud   string   `json:"aud"`   // 接收方
Iat   int64    `json:"iat"`   // 签发时间
Exp   int64    `json:"exp"`   // 过期时间
Jti   string   `json:"jti"`   // 唯一身份标识
Roles []string `json:"roles"` // 角色信息
}

// GenSignature 计算signature值的函数
func GenSignature(s string, secret string) (string, error) {
h := hmac.New(sha256.New, []byte(secret))
_, err := h.Write([]byte(s))
if err != nil {
return "", err

}
signatureBytes := h.Sum(nil)
// 对签名进行base64编码
signature := base64.RawURLEncoding.EncodeToString(signatureBytes)
return signature, nil
}

func main() {
// 秘钥--这个要放在服务端的
secret := "test"

// 计算头信息
header := JwtHeaderRaw{
Alg: "HS256",
Typ: "JWT",
}
headerBytes, _ := json.Marshal(header)
headerStr := base64.RawURLEncoding.EncodeToString(headerBytes)

// 计算载荷信息
payload := JwtPayloadRaw{
Iss:   "test",
Sub:   "test",
Aud:   "test",
Iat:   time.Now().Unix(),
Exp:   time.Now().Unix() + int64(10*60),
Jti:   "test",
Roles: []string{"admin"},
}
payloadBytes, _ := json.Marshal(payload)
payloadStr := base64.RawURLEncoding.EncodeToString(payloadBytes)

// 计算签名
signature, _ := GenSignature(headerStr+"."+payloadStr, secret)

// 组合得到token
token := headerStr + "." + payloadStr + "." + signature
fmt.Println(token)
}
posted @ 2025-03-31 17:41  CJTARRR  阅读(29)  评论(0)    收藏  举报