Files
sign-doc/go/main.go

140 lines
3.6 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"sound-force/sign-doc/go/apisign"
"strings"
)
func main() {
var accessKeyId string
var secretKey string
var apiBaseURL string
var algorithmStr string
var params []string
flag.StringVar(&accessKeyId, "k", os.Getenv("ACCESS_KEY_ID"), "访问密钥ID")
flag.StringVar(&secretKey, "s", os.Getenv("SECRET_KEY"), "密钥")
flag.StringVar(&apiBaseURL, "u", os.Getenv("API_BASE_URL"), "API基础URL")
flag.StringVar(&algorithmStr, "a", os.Getenv("SIGN_ALGORITHM"), "签名算法")
flag.Func("p", "请求参数 (格式: key=value)", func(s string) error {
params = append(params, s)
return nil
})
flag.Parse()
if accessKeyId == "" {
accessKeyId = "test-access-key-id"
}
if secretKey == "" {
secretKey = "test-secret-key"
}
if apiBaseURL == "" {
apiBaseURL = "https://api.example.com/v1"
}
if algorithmStr == "" {
algorithmStr = "MD5"
}
algorithm, err := apisign.ParseAlgorithm(algorithmStr)
if err != nil {
fmt.Printf("Warning: %v, using MD5 as default\n", err)
algorithm = apisign.MD5
}
options := apisign.NewDefaultSignOptions()
options.Algorithm = algorithm
// 将签名参数名从默认的"signature"改为"sign"
options.SignatureName = "sign"
signer := apisign.NewAPISigner(options)
requestParams := make(map[string]string)
if len(params) > 0 {
for _, p := range params {
parts := strings.SplitN(p, "=", 2)
if len(parts) == 2 {
requestParams[parts[0]] = parts[1]
}
}
} else {
requestParams = map[string]string{
"userId": "12345",
"action": "getData",
"data": "测试数据",
}
}
fmt.Println("===================== API签名示例 =====================")
fmt.Printf("AccessKeyId: %s\n", accessKeyId)
fmt.Printf("SecretKey: %s\n", secretKey)
fmt.Printf("签名算法: %s\n", algorithm.String())
fmt.Printf("基础URL: %s\n", apiBaseURL)
fmt.Println("请求参数:", requestParams)
channelId := getEnv("CHANNEL_ID", "test-channel-id")
if val, ok := requestParams["channelId"]; ok {
channelId = val
}
signedParams := signer.SignRequest(requestParams, accessKeyId, secretKey, channelId)
fmt.Println("\n签名后的参数:")
for k, v := range signedParams {
fmt.Printf(" %s: %s\n", k, v)
}
signedURL := signer.SignURL(apiBaseURL, requestParams, accessKeyId, secretKey, channelId)
fmt.Println("\n签名后的URL:")
fmt.Println(signedURL)
valid, err := signer.VerifySignature(signedParams, secretKey, 300000)
fmt.Println("\n签名验证结果:")
if err != nil {
fmt.Printf(" 验证失败: %v\n", err)
} else if valid {
fmt.Println(" 验证成功")
} else {
fmt.Println(" 验证失败: 签名不匹配")
}
fmt.Println("\n不同算法的签名结果:")
demonstrateAlgorithms(requestParams, accessKeyId, secretKey)
}
// getEnv 获取环境变量,如果不存在则返回默认值
func getEnv(key, defaultValue string) string {
value := os.Getenv(key)
if value == "" {
return defaultValue
}
return value
}
// demonstrateAlgorithms 演示不同算法的签名结果
func demonstrateAlgorithms(params map[string]string, accessKeyId, secretKey string) {
algorithms := []apisign.SignatureAlgorithm{
apisign.MD5,
apisign.SHA1,
apisign.SHA256,
apisign.HMACSHA256,
}
keys := make([]string, 0, len(params))
for k := range params {
keys = append(keys, k)
}
strings.Join(keys, "&")
for _, alg := range algorithms {
options := apisign.NewDefaultSignOptions()
options.Algorithm = alg
options.SignatureName = "sign"
signer := apisign.NewAPISigner(options)
signature := signer.CalculateSignature(params, secretKey)
fmt.Printf(" %s: %s\n", alg.String(), signature)
}
}