✨ 添加API签名工具的初始实现,包括模块定义、主程序、签名库和文档。
This commit is contained in:
139
go/main.go
Normal file
139
go/main.go
Normal file
@@ -0,0 +1,139 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user