c26b06f1cc
Go 控制面(SQLite + REST API)嵌入 Mihomo 数据面,Vue 3 多语言 Web 管理台。 含订阅/节点/规则/出站/监控/日志、OpenAPI、API Key、Gitea Actions CI 与开源文档; CI 使用 ubuntu-latest runner,Go/Docker 步骤走国内镜像与 shell,避免 GitHub 下载超时。 Co-authored-by: Cursor <cursoragent@cursor.com>
52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package auth
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
const APIKeyPrefix = "prism_"
|
|
|
|
func GenerateAPIKey() (string, error) {
|
|
var b [16]byte
|
|
if _, err := rand.Read(b[:]); err != nil {
|
|
return "", err
|
|
}
|
|
return APIKeyPrefix + hex.EncodeToString(b[:]), nil
|
|
}
|
|
|
|
func HashAPIKey(key string) string {
|
|
sum := sha256.Sum256([]byte(key))
|
|
return hex.EncodeToString(sum[:])
|
|
}
|
|
|
|
func APIKeyDisplayPrefix(key string) string {
|
|
key = strings.TrimSpace(key)
|
|
if len(key) <= 12 {
|
|
return key
|
|
}
|
|
return key[:12] + "…"
|
|
}
|
|
|
|
func IsAPIKeyFormat(key string) bool {
|
|
return strings.HasPrefix(strings.TrimSpace(key), APIKeyPrefix)
|
|
}
|
|
|
|
func ValidateAPIKeyFormat(key string) error {
|
|
key = strings.TrimSpace(key)
|
|
if !strings.HasPrefix(key, APIKeyPrefix) {
|
|
return fmt.Errorf("invalid api key format")
|
|
}
|
|
raw := strings.TrimPrefix(key, APIKeyPrefix)
|
|
if len(raw) != 32 {
|
|
return fmt.Errorf("invalid api key length")
|
|
}
|
|
if _, err := hex.DecodeString(raw); err != nil {
|
|
return fmt.Errorf("invalid api key encoding")
|
|
}
|
|
return nil
|
|
}
|