package main

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

// JWTToken 用于生成JWT鉴权令牌
type JWTToken struct {
	AccessKey    string `json:"access_key"`
	AccessSecret string `json:"access_secret"`
	Timestamp    string `json:"timestamp"`
	Signature    string `json:"signature"`
}

// GenerateJWTToken 生成JWT鉴权令牌
func GenerateJWTToken(accessKey, accessSecret string, tokenTime time.Time) (string, error) {
	// 设置签名字典
	signData := []byte(`{"access_key":"` + accessKey + `","timestamp":"` + tokenTime.Format(time.RFC3339) + `"}`)
	h := hmac.New(sha256.New, []byte(accessSecret))
	h.Write(signData)
	signature := h.Sum(nil)

	// 构建JWT鉴权令牌结构体
	jwtToken := JWTToken{
		AccessKey:    accessKey,
		AccessSecret: accessSecret,
		Timestamp:    tokenTime.Format(time.RFC3339),
		Signature:    base64.StdEncoding.EncodeToString(signature),
	}

	// 将JWT鉴权令牌转换为JSON字符串并返回
	jsonData, err := json.Marshal(jwtToken)
	if err != nil {
		return "", err
	}
	jwtTokenStr := string(jsonData)
	return jwtTokenStr, nil
}

func main() {
	// 假设应用管理中的AccessKey和AccessSecret已经获取到，这里作为示例使用
	accessKey := "your_access_key"
	accessSecret := "your_access_secret"
	tokenTime := time.Now() // 生成当前时间戳作为鉴权令牌的时间戳

	// 生成JWT鉴权令牌并打印结果
	jwtToken, err := GenerateJWTToken(accessKey, accessSecret, tokenTime)
	if err != nil {
		fmt.Println("生成JWT鉴权令牌失败:", err)
		return
	}
	fmt.Println("生成的JWT鉴权令牌:", jwtToken)
}
