2026-05-09 13:11:09 +08:00
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
|
2026-05-09 21:00:40 +08:00
|
|
|
"apigo.cc/go/safe"
|
2026-05-09 13:11:09 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Signer 负责为请求附加签名信息
|
|
|
|
|
type Signer interface {
|
|
|
|
|
Sign(req *HttpRequest, config map[string]any) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var signers = map[string]Signer{
|
|
|
|
|
"basic": &basicSigner{},
|
|
|
|
|
"bearer": &bearerSigner{},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RegisterSigner 注册全局签名器
|
|
|
|
|
func RegisterSigner(name string, s Signer) {
|
|
|
|
|
signers[name] = s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetSigner 获取签名器
|
|
|
|
|
func GetSigner(name string) Signer {
|
|
|
|
|
return signers[name]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 快速应用签名
|
|
|
|
|
func sign(name string, req *HttpRequest, config map[string]any) error {
|
|
|
|
|
if name == "" {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
s := GetSigner(name)
|
|
|
|
|
if s == nil {
|
|
|
|
|
return errors.New("signer not found: " + name)
|
|
|
|
|
}
|
|
|
|
|
return s.Sign(req, config)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 内置标准签名器实现
|
|
|
|
|
|
|
|
|
|
type basicSigner struct{}
|
|
|
|
|
|
|
|
|
|
func (s *basicSigner) Sign(req *HttpRequest, config map[string]any) error {
|
2026-05-09 21:00:40 +08:00
|
|
|
req.SetHeader("Authorization", "Basic ", safe.Base64(config["username"], ":", config["password"]))
|
2026-05-09 13:11:09 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type bearerSigner struct{}
|
|
|
|
|
|
|
|
|
|
func (s *bearerSigner) Sign(req *HttpRequest, config map[string]any) error {
|
2026-05-09 21:00:40 +08:00
|
|
|
token := config["token"]
|
|
|
|
|
if token == nil {
|
|
|
|
|
token = config["key"]
|
2026-05-09 13:11:09 +08:00
|
|
|
}
|
2026-05-09 21:00:40 +08:00
|
|
|
|
|
|
|
|
req.SetHeader("Authorization", "Bearer ", token)
|
2026-05-09 13:11:09 +08:00
|
|
|
return nil
|
|
|
|
|
}
|